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 读取单个 UTF 编码字符串,该字符串以无符号 16 位长度开头,后跟字符串。因此,它可以包含多行,但不能用于读取文本文件。

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 回答