开发者

IOException: Read Error

If you want more info on the error, the full source can be downloaded here

Hey, I'm reading an ini file using java.util.Propert开发者_Go百科ies; and I've run into a strange issue. When I try to load a specific file, the thing spits out this strange exception that I've been trying for about a day to eliminate.

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)

I had previously been reading this file just fine with no problems, I then changed a bit of how I was calling and had to add an extra line at the bottom. If I remove that line, the problem does not occour.

the txt file is:

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

If I remove the num_planes=1 line, the file gets read fine.

Relevant code:

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

}


That is why:

Your code (flight_optimizer.java, line 82 and further):

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

Both the second line and every cycle iteration leads us here (IniReader.java, line 17):

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

You are trying to use the same InputStream multiple times, moreover, you are trying to use it after it already was closed. You will need to recreate the stream, or, preferably, read configuration once and use it multiple times.

As a side note, the recommended way to use the streams in Java is the following:

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

This will make sure that the system resources associated with the stream will always be released.


I had the same problem. Turns out that my underlying InputStream was already closed. That became obvious when I ran my test under Linux, where a more meaningful error message was emitted by the operating system.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜