首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java的RandomAccessFIle EOFException

Java的RandomAccessFIle EOFException
EN

Stack Overflow用户
提问于 2014-02-24 06:06:15
回答 2查看 2.2K关注 0票数 1

Main:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:我试图让我的程序处理具有以下内容的文件:

代码语言:javascript
复制
Это тест UTF-8 чтения

只有在offset = 0的情况下,它才能正常工作。任何其他偏移量都会引发EOFException。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-26 21:24:54

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

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

在您的例子中,一组不同的类可以解决这个问题。考虑使用RAFReader重写InputStreamReader类:

代码语言:javascript
复制
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封装。

代码语言:javascript
复制
InputStream is = Channels.newInputStream(reader.getChannel());
票数 3
EN

Stack Overflow用户

发布于 2014-02-24 06:17:53

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

获得EOFException的一种可能方法是排队

代码语言:javascript
复制
reader.seek(offset); 
String output = reader.readUTF();

也许offset值对于文件长度是高的。尝试使用offset = 0并检查您是否得到了EOF

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21980090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档