1行10GBのファイルがあり、その上でいくつかの操作をする必要があるとします(ランダムな文字、arggzdfnbnipntrsなど)。Java - 1行のファイルを読む
例として、このような行が回文かどうかを確認するよう求められますが、メモリに完全に読み込むことはできません。最初のキャラクタをロードして最後のキャラクタと比較する必要があります。これはJavaでどのように行われますか? (UTF-8サポートを含む)
1行10GBのファイルがあり、その上でいくつかの操作をする必要があるとします(ランダムな文字、arggzdfnbnipntrsなど)。Java - 1行のファイルを読む
例として、このような行が回文かどうかを確認するよう求められますが、メモリに完全に読み込むことはできません。最初のキャラクタをロードして最後のキャラクタと比較する必要があります。これはJavaでどのように行われますか? (UTF-8サポートを含む)
UTF-8は可変長符号化で、各文字は1〜6バイトです。単純にファイルの最初のバイトと最後のバイトを比較することはできません。最初の文字の符号化された長さに応じて、最初のバイトと6番目と最後のバイトを比較する必要があります。
RandomAccessFile
またはFileChannel
を使用すると、比較的効率的なランダムファイルアクセスが可能ですが、API(または基本ファイルシステム)は「後方」の読み取り用に設計されていません。逆戻りするには、read()
の前にはseek()
がなければなりません。
あるレベルでは、ブロック全体がファイルシステムから読み込まれ、メモリに保持されるため、実際のハードドライブヘッドの実際のシークと読み取りは最小限に抑えられます。 Javaからオペレーティングシステムへのこれらの呼び出しを何十億も作成するのに伴うオーバーヘッドがスタックアップするため、独自のバッファを保守する価値があるかもしれません。シークとバルク読み出しは、バッファが空の場合にのみ実行されます。
幸いなことに、あなたの先生はユニコードのサポートを求めていませんでした。
それはそれを要約する。ありがとうございました。 – Hydroxis
ファイルを複数の行に分割できますか? – azurefrog
@azurefrogあなたは何でもできます。 – Hydroxis
あなたがそれを切り刻むことができる場合、[ファイルを1行ずつ逆順に読む]を見てください(http://stackoverflow.com/questions/6011345/read-a-file-line-by-line逆順)。最初の行と最後の行とを比較します。 – azurefrog