2

私は携帯電話で実行するモバイルアプリを作成し、最も効率的な方法で携帯電話からデータを読み取ろうとしています。アプリケーションはデータをサーバーアプリに送信します(バイトの形式で、必ずしも文字ではありません)。

データの長さはわかりません。終了は3バイトのマーカー(つまり、0x11,0x22,0x33)でマークされ、新しいデータセットが送信されます。データの「セット」ごとに大量のデータが送信される可能性があります。では、このデータを読み取る最も効率的な方法は何でしょうか。使用する必要がありますInputStreamReaderか?BufferedReader?もちろん、各文字を調べてマーカーの一部であるかどうかを確認し、含まれている場合は、マーカーの前にあるすべてのデータを別の処理方法に送信する必要があります。

私が言えることから、私のエンドマーカーが(明らかにそうではない)である場合BufferedReader.readLine()私が望むものになるでしょう。バイトごとに読み取り、マーカーを探すために独自のメソッドを作成する必要がありますか?(これが最も効率的な方法かどうかもわかりませんか?)\nBufferedReader

4

2 に答える 2

6

データが文字データではなくバイトデータであると仮定すると、ソケット入力ストリームをでラップしBufferedInputStream、それを使用して一度に1バイトずつデータを読み取り、バイトをある種のバイトバッファに保存する必要があります。(1つのオプションは、を使用して、ByteArrayOutputStreamから読み取ったデータバイトをバッファリングすることですBufferedInputStream。)

BufferedReaderそしてreadLine()行く方法ではありません:

  • データが文字データではないと仮定すると、何らかの文字セットに従ってデータをデコードしようとすると、データを壊してしまう可能性があります。
  • このメソッドは、および/または文字でreadLine区切られた行のみを理解します。他の「行」区切り文字を理解する方法はありません。'\n''\r'

BufferedInputStream最後に、パフォーマンス上の理由から、は非常に重要であることに注意してください。1つを使用せず、一度に1バイトずつソケットInputStreamから読み取る場合、Javaアプリが実行するシステムコールの数が原因で、パフォーマンスが大幅に低下する可能性があります。

于 2010-09-17T03:46:52.740 に答える
0

Readerはテキストを読み取るためのものであるため、代わりにInputStreamが必要になる可能性があります。ストリームは通常、バッファリングする方が効率的であるため、BufferedInputStreamを使用します。また、ストリームデータ内のマーカーを検出するための組み込み関数を知らないので、自分で行う必要があります。

于 2010-09-17T03:52:34.480 に答える