IOException:读取错误

时间:2011-04-16 03:15:13

标签: java ioexception

如果您想了解有关错误的更多信息,可以下载完整的来源here

嘿,我正在使用java.util.Properties读取一个ini文件;我遇到了一个奇怪的问题。当我尝试加载一个特定的文件时,这个东西吐出了这个奇怪的异常,我已经尝试了大约一天来消除它。

java.io.IOException: Read error
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(Unknown Source)
    at java.util.Properties$LineReader.readLine(Unknown Source)
    at java.util.Properties.load0(Unknown Source)
    at java.util.Properties.load(Unknown Source)
    at IniReader.load(IniReader.java:20)
    at plane.<init>(plane.java:22)
    at renderingArea.<init>(flight_optimizer.java:93)
    at flight_optimizer_GUI.<init>(flight_optimizer.java:159)
    at flight_optimizer.main(flight_optimizer.java:46)

我之前一直在阅读这个文件没问题,然后我改变了一些我打电话的方式,不得不在底部添加一个额外的行。如果我删除该行,则不会出现问题。

txt文件是:

x=0
y=0
max_velocity=.1
passengers=100
num_planes=1

如果删除num_planes = 1行,则文件读取正常。

相关代码:

import java.util.Enumeration;

public class IniReader {

    //global vars

    public IniReader(){
        // initializeing stuffs
    }

    public void load(InputStream inStream) throws IOException {
        this.inStream = inStream;
        this.properties.load(this.inStream);
        this.keys = this.properties.propertyNames();
        inStream.close();
    }
}

class renderingArea extends JPanel {

    //Global vars
    private IniReader ini;

    public renderingArea(){
        super();
        // Initializing some things 
        files = new fileManager();
        ini = new IniReader();

        FileInputStream planeStream;
        FileInputStream cityStream;
        try {
            planeStream = files.getIni("plane.ini");
            ini.load(planeStream);

            //extraneous code

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (NumberFormatException e1) {
            e1.printStackTrace();
        }   
    }

    //moar extraneous code

}

2 个答案:

答案 0 :(得分:4)

这就是为什么:

您的代码(flight_optimizer.java,第82行及其他内容):

FileInputStream planeStream;
...
planeStream = files.getIni("plane.ini");
ini.load(planeStream);
...
for( int i=0; i<planes.length; i++ ){
    planes[i] = new plane(planeStream);
}

第二行和每个循环迭代都引导我们(IniReader.java,第17行):

public void load(InputStream inStream) throws IOException {
    this.inStream = inStream;
    this.properties.load(this.inStream);
    this.keys = this.properties.propertyNames();
    inStream.close();
}

您尝试多次使用相同的InputStream,而且,您在尝试关闭它之后尝试使用它。您需要重新创建流,或者最好是读取一次配置并多次使用它。

作为旁注,在Java中使用流的推荐方法如下:

InputStream is = ...;
try {
   // Reading from the stream
} finally {
   is.close();
}

这将确保始终释放与流关联的系统资源。

答案 1 :(得分:0)

我遇到了同样的问题。事实证明我的基础InputStream已经关闭。当我在Linux下运行测试时,这一点变得很明显,操作系统发出了更有意义的错误消息。