IOException: Ошибка чтения - PullRequest
       10

IOException: Ошибка чтения

0 голосов
/ 16 апреля 2011

Если вам нужна дополнительная информация об ошибке, полный исходный код можно загрузить здесь

Эй, я читаю INI-файл, используя java.util.Properties;и я столкнулся со странной проблемой.Когда я пытаюсь загрузить определенный файл, эта вещь выдает это странное исключение, которое я пытался устранить в течение дня.

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 ]

4 голосов
/ 16 апреля 2011

Вот почему:

Ваш код (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();
}

Это обеспечит постоянное освобождение системных ресурсов, связанных с потоком.

0 голосов
/ 07 мая 2016

У меня была такая же проблема.Оказывается, мой базовый InputStream уже был закрыт.Это стало очевидным, когда я запустил свой тест под Linux, где операционная система выпустила более значимое сообщение об ошибке.

...