gpt4 book ai didi

Java 的 RandomAccessFIle EOFException

转载 作者:行者123 更新时间:2023-11-29 05:28:12 24 4
gpt4 key购买 nike

主要内容:

package main;

import racreader.RAFReader;

public class RandomAccessFile {

public static void main(String[] args) {
if (args.length != 2) {
System.err.println("Wrong arguments length");
System.exit(1);
}
try {
RAFReader reader = new RAFReader (args[0]);
try {

String output = reader.readUTF(Integer.parseInt(args[1]));
System.out.print(output);
} catch (Exception e) {
System.err.println(e.toString());
} finally {
reader.close();
}
} catch (Exception e) {
System.err.println(e.toString());
}
}
}

英国皇家空军读者:

package racreader;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RAFReader {

private final String fileName;
private final RandomAccessFile reader;

public RAFReader(String fileName) throws FileNotFoundException {
this.fileName = fileName;
this.reader = openFile();

}

private RandomAccessFile openFile() throws FileNotFoundException {
RandomAccessFile reader = new RandomAccessFile(fileName, "r");
return reader;
}

public String readUTF(int offset) throws IOException {
reader.seek(offset);
String output = reader.readUTF();
return output;
}

public void close() throws IOException {
reader.close();
}
}

问题出在每个文件(甚至以 UTF8 编码)和每个偏移量中的 EOFException 中。为什么?

UPD:我尝试让我的程序处理包含以下内容的文件:

Это тест UTF-8 чтения

只有当 offset = 0 时它才能正常工作。任何其他偏移都会抛出 EOFException。

最佳答案

RandomAccessFile 中的 readUTF()/writeUTF() 方法使用编写 Java String 对象的约定, UTF 编码的文本文件不一定支持。 readUTF() 并非用于读取任意文本文件,该文件最初不是使用 RandomAccessFile.writeUTF() 编写的。

正如方法 Javadocs 指定的那样,readUTF() 假定它读取的前两个字节包含以下字符串中的字节数。如果字符串是通过配对 writeUTF() 方法写入文件的情况,但在文本文件的情况下,这将间歇性地抛出 EOFException,因为前两个bytes 将包含字符串中的实际字符。

在您的情况下,一组不同的类可以解决问题。考虑使用 InputStreamReader 重写 RAFReader 类:

public String readUTF(int offset) throws IOException {
FileInputStream is = new FileInputStream(fileName);

Reader fileReader = new InputStreamReader(is, "UTF-8");
StringBuilder stringBuilder = new StringBuilder();

fileReader.skip(offset);

int charsRead;
char buf[] = new char[256];

//Read until there is no more characters to read.
while ((charsRead = fileReader.read(buf)) > 0) {
stringBuilder.append(buf, 0, charsRead);
}

fileReader.close();

return stringBuilder.toString();
}

如果必须使用RandomAccessFile,您可以使用包装RandomAccessFile 的输入流。最简单的方法是通过 FileChannel,由 RandomAccessFile 封装:

InputStream is = Channels.newInputStream(reader.getChannel());

关于Java 的 RandomAccessFIle EOFException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21980090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com