0

RandomAccessFile を使用して xml ファイルを読み取ろうとしています。問題は、ファイルの終わりまで一度に特定の長さだけを読みたいということです。

ReadUTF() read entire lines in the file which I do not want
Read(byte,start,end) seems what I need, but it is readying in byte so it doesnt contain the actual text of the read content.

RandomAccessFile を使用して一度に特定の長さの xml ファイルを読み取る方法はありますか?

ありがとう。

4

2 に答える 2

0

readUTF は、符号なし 16 ビット長で始まり、その後に文字列が続く単一の UTF エンコード文字列を読み取ります。そのため、多くの行を含めることができますが、テキスト ファイルの読み取りには使用できません。

RandomAccessFile はバイナリ形式用に設計されているため、テキストの読み取りはほとんどサポートされていません。

BufferedReader と skip() を使用してランダム アクセスを試みましたか?

于 2012-07-17T15:37:51.083 に答える
-1

の方法getChannel()RandomAccessFileファイルの一部にアクセスできます。

たとえば、ここでは、非常に大きな xml ファイル (2go) の位置 100 から始まる 2000 バイトをマップします。

    FileChannel channel = new RandomAccessFile("frwiktionary-20120216-pages-meta-current.xml", "r").getChannel();
    ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 100, 2000);

    //Change the value with the proper encoding
    Charset chars = Charset.forName("ISO-8859-1"); 

    CharBuffer cbuf = chars.decode(buffer);
    System.out.println("buffer = " + cbuf);

編集(下のコメントを参照)

シングルバイトエンコーディングで動作するだけでなく、このテストを参照してください:

FileOutputStream fop = new FileOutputStream("/home/alain/Bureau/utf16.txt");
try (OutputStreamWriter wr = new OutputStreamWriter(fop, "UTF-16")) {
    wr.write("test test toto 测");
}

FileChannel channel = new RandomAccessFile("/home/alain/Bureau/utf16.txt", "r").getChannel();
ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
Charset chars = Charset.forName("UTF-16");
CharBuffer cbuf = chars.decode(buffer);
System.out.println("buffer = " + cbuf);

出力:

buffer = test test toto 测</p>

于 2012-07-17T15:51:37.350 に答える