ファイルの ascii 部分を解析しようとして問題が発生しました。終了タグに到達すると、すぐにその時点からバイトの読み取りが開始されます。Java で行または単語全体を読み取るために知っていることはすべて、バッファーを作成します。これにより、停止ポイントの直後にバイトを取得する可能性が失われます。これをバイト単位で読み取り、改行を見つけ、改行の前にすべてを再構築し、それが私の終了タグかどうかを確認し、そこから移動する唯一の方法はありますか?
5 に答える
「線」という概念を捨てるのが一番だと思います。終了タグを見つけるには、終了タグを含めるのに十分な大きさのリング バッファーを作成し、バイト単位で読み取り、各バイトの後にタグが含まれているかどうかを確認します。
より洗練された効率的な検索アルゴリズムがありますが、その違いは検索語が長い場合にのみ関連します (おそらく終了タグが短いと思われます)。
それは可能ですが、私が知る限り、API のクラスではありません。
手動で行うことができます - /をサポートするBufferedInputStreamとして開きます。ブロックごとに読み取り ( )、ASCII として解析します。最終的には、マーカーに到達するまでバッファに蓄積します。しかし、あなたが電話する前に。ASCII で必要なすべてを読み取ったと思われる場合は、を呼び出してから、残りの ASCII 部分をダンプするためにを呼び出します。これで、ファイルのバイナリ部分を読み取る準備ができました。mark
reset
byte[]
read
mark
reset
read
BufferedInputStream
InputStream
このファイルの大きさは?私の最初の考えは、すべてを処理しようとせずに ByteBuffer または ByteArrayOutputStream に読み込み、バイト値を比較してタグを見つけることです。テキスト部分の終了位置とバイナリ部分の開始位置がわかったら、各部分を適切に処理します。
ファイルは大きくなっていますか、それとも静的ですか?
静的な場合は、http://java.sun.com/javase/6/docs/api/java/nio/MappedByteBuffer.htmlを参照してください。
うん、あなたはバイトごとに正しいです。抽象化には欠点があります。