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

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

Эй, я читаю 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)

Раньше я без проблем читал этот файл без проблем, затем немного изменил порядок звонков и добавил дополнительную строку внизу. Если я уберу эту строку, проблема не возникнет.

текстовый файл:

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 ответа

Решение

Поэтому:

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

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

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

Другие вопросы по тегам