これまで Java IO API を身近に体験したことがなく、今は本当にイライラしています。それがどれほど奇妙で複雑で、単純なタスクを実行するのがどれほど難しいか、信じがたいです。
私の仕事: 2 つの位置 (開始バイト、終了バイト)pos1
とpos2
. これらの 2 バイト間の行 (開始バイトを含み、終了バイトは含まない) を読み取り、それらを UTF8 String オブジェクトとして使用する必要があります。
たとえば、ほとんどのスクリプト言語では、次のような非常に単純な 1-2-3 ライナーになります (Ruby では、Python、Perl などでも本質的に同じになります)。
f = File.open("file.txt").seek(pos1)
while f.pos < pos2 {
s = f.readline
# do something with "s" here
}
Java IO API ではすぐに地獄に落ちます ;) 実際、\n
通常のローカル ファイルから行 ( で終わる)を読み取る方法は 2 つあります。
- および_
getFilePointer()
_seek(long pos)
_ _ _read*()
_read()
_ >かなり遅い)。 - BufferedReaderには優れ
readLine()
たメソッドがあり、 でシークすることもできskip(long n)
ますが、ファイル内の現在の位置は言うまでもなく、既に読み取られた偶数バイトを特定する方法はありません。
私は次のようなものを使用しようとしました:
FileInputStream fis = new FileInputStream(fileName);
FileChannel fc = fis.getChannel();
BufferedReader br = new BufferedReader(
new InputStreamReader(
fis,
CHARSET_UTF8
)
);
...そして、fc.position()
現在のファイル読み取り位置を取得fc.position(newPosition)
して設定するために使用しますが、私の場合はうまくいかないようです:BufferedReaderによって行われたバッファの事前充填の位置を返すように見えます-これらカウンターは 16K 単位で切り上げられているようです。
私は本当にそれをすべて自分で実装する必要がありますか?
- ファイル内の位置を取得/設定できるようにする
- バッファファイルの読み込み操作
- UTF8 文字列の読み取りを許可します (または、少なくとも「次まですべてを読み取る」などの操作を許可します
\n
)
すべてを自分で実装するよりも簡単な方法はありますか? 私は何かを監督していますか?