如果您想了解有关错误的更多信息,可以下载完整的来源here
嘿,我正在使用java.util.Properties读取一个ini文件;我遇到了一个奇怪的问题。当我尝试加载一个特定的文件时,这个东西吐出了这个奇怪的异常,我已经尝试了大约一天来消除它。
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
}
答案 0 :(得分:4)
这就是为什么:
您的代码(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();
}
这将确保始终释放与流关联的系统资源。
答案 1 :(得分:0)
我遇到了同样的问题。事实证明我的基础InputStream已经关闭。当我在Linux下运行测试时,这一点变得很明显,操作系统发出了更有意义的错误消息。