Java';随机存取文件EOFEException

Java';随机存取文件EOFEException,java,utf-8,Java,Utf 8,主要内容: 拉弗瑞德: 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)

主要内容:

拉弗瑞德:

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());
        }
    }
}
问题在于每个文件(甚至用UTF8编码)和每个偏移量中的EOFEException。为什么?

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

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(); 
    }
}
只有当偏移量=0时,它才能正常工作。任何其他偏移量抛出EOFEException

EOFEException-如果此文件在读取所有 字节

获得EOFEException的一种可能方式是在第行

Это тест UTF-8 чтения
对于文件长度,
偏移量
值可能较高。尝试使用
offset=0
并检查是否获得
EOF

来自
RandomAccesFile
readUTF()
/
writeUTF()
方法使用约定来编写Java
String
对象,UTF编码的文本文件不一定遵守这些约定
readUTF()
不用于读取任意文本文件,该文件最初不是使用
RandomAccesFile.writeUTF()
编写的

正如Javadocs方法所指定的,
readUTF()
假定它读取的前两个字节包含以下字符串中的字节数。如果字符串是通过配对
writeUTF()
方法写入文件的,则会出现这种情况,但对于文本文件,这将引发间歇性的
EOFEException
,因为前两个字节将包含字符串中的实际字符

在您的情况下,一组不同的类可以解决这个问题。考虑改写<代码> RAFReader < /代码>类,使用<代码> InputStreamReader <代码>:

reader.seek(offset); 
String output = reader.readUTF();
如果必须使用
RandomAccesFile
,则可以使用包装
RandomAccesFile
的输入流。最简单的方法是通过FileChannel,由
RandomAccesFile
封装:

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();
}

只有当
offset==0
@user23791这是您的解决方案时,我才得到EOF。不要用
seek
函数设置大于文件长度的文件指针。但是为什么
offset=1
会引发EOFEException?我的文件包含多个byte@user23791用另一种方式问这个问题。也许其他人可以帮助你。但有时我在开始阅读时会得到一些特殊符号,带有一些
RandomAccessFile
offset。如何自同步UTF
InputStream
?如果偏移量是要跳过的字符数,请确保使用的是
Reader#skip()
,而不是
RandomAccessFile#seek()
。后者的位置以字节为单位,因此它可以将流指向字符的中间,该字符由几个字节编码,因此是特殊符号。
InputStream is = Channels.newInputStream(reader.getChannel());