IOException: Read Error

孤街浪徒 提交于 2020-03-06 06:57:20

问题


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.Properties; 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

}

回答1:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/5684250/ioexception-read-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!