Java的RandomAccessFIle EOFException

时间:2014-02-24 06:06:16

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

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

UPD:我尝试让我的程序使用包含此内容的文件:

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

仅在offset = 0时才能正常工作。任何其他偏移都会抛出EOFException。

2 个答案:

答案 0 :(得分:2)

来自readUTF()的{​​{1}} / writeUTF()方法使用约定来编写Java RandomAccesFile对象,这些对象不一定受UTF编码文本文件的尊重。 String并不打算用于读取任意文本文件,该文件最初并非使用readUTF()编写。

正如Javadocs指定的方法,RandomAccesFile.writeUTF()假定它读取的前两个字节包含以下字符串中的字节数。如果通过配对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的输入流。最简单的方法是通过FileChannel,由RandomAccesFile封装:

RandomAccesFile

答案 1 :(得分:0)

  

EOFException - 如果此文件在读取所有文件之前到达结尾   字节。

您获得EOFException的一种可能方式是

reader.seek(offset); 
String output = reader.readUTF();

文件长度可能offset值很高。尝试使用offset = 0并检查您是否获得EOF