Main:
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());
}
}
}RAFReader:
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();
}
}问题在于EOFException中的每个文件(甚至用UTF8编码)和每个偏移量。为什么?
UPD:我试图让我的程序处理具有以下内容的文件:
Это тест UTF-8 чтения只有在offset = 0的情况下,它才能正常工作。任何其他偏移量都会引发EOFException。
发布于 2014-02-26 21:24:54
来自readUTF()/writeUTF()的RandomAccesFile方法使用编写String对象的约定,而这些不一定是UTF编码的文本文件所遵循的。readUTF()不打算用于读取任意文本文件,该文本文件最初不是使用RandomAccesFile.writeUTF()编写的。
正如Javadocs所指定的那样,readUTF()假定它读取的前两个字节包含以下字符串中的字节数。如果字符串是通过配对的writeUTF()方法写入文件的,则是这样的,但是如果是文本文件,则会抛出间歇的EOFException,因为前两个字节将包含来自字符串的实际字符。
在您的例子中,一组不同的类可以解决这个问题。考虑使用RAFReader重写InputStreamReader类:
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();
}如果必须使用RandomAccesFile,则可以使用包装RandomAccesFile的输入流。最简单的方法是通过FileChannel,由RandomAccesFile封装。
InputStream is = Channels.newInputStream(reader.getChannel());发布于 2014-02-24 06:17:53
EOFException --如果该文件在读取所有字节之前到达末尾。
获得EOFException的一种可能方法是排队
reader.seek(offset);
String output = reader.readUTF();也许offset值对于文件长度是高的。尝试使用offset = 0并检查您是否得到了EOF。
https://stackoverflow.com/questions/21980090
复制相似问题