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, где операционная система выпустила более значимое сообщение об ошибке.