我有一种方法,可以将列表中的数据写入文件,将方法从文件中的数据读取到列表中,还可以将文件中的列表中的数据写入指定次数。使用第一种方法writeFile ()
后,我尝试从文件中提取数据,一切正常。我通过readFile ()
方法将文件中的数据读取到列表中。之后,我使用了将所需次数写入文件的方法,一切正常,它写入multyWrite ()
。但是在那之后,由于得到了
readFile ()
方法从文件中读取数据。
异常堆栈跟踪:
Exception in thread "main" java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1599)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at ProductService.readFile(ProductService.java:47)
at Main.main(Main.java:21)
我知道我应该使用objectOutputStream.reset ()
,但是在哪里使用会更好呢?
private String fileName;
private ProductInterface<FlyingMachine> productService = new ProductInterfaceImpl();
private ObjectOutputStream objectOutputStream;
private FileOutputStream fileOutputStream;
public ProductService(String fileName) throws IOException {
this.fileName = fileName;
fileOutputStream = new FileOutputStream(fileName);
this.objectOutputStream = new ObjectOutputStream(fileOutputStream);
}
public void writeFile() throws IOException {
try {
for (FlyingMachine f : productService.getProductContainer()) {
objectOutputStream.writeObject(f);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
objectOutputStream.flush();
objectOutputStream.close();
fileOutputStream.close();
}
}
}`
public void readFile() throws IOException {
ObjectInputStream objectInputStream = null;
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(fileName);
objectInputStream = new ObjectInputStream(fileInputStream);
while (fileInputStream.available() > 0) {
FlyingMachine flyingMachine = (FlyingMachine) objectInputStream.readObject();
productService.getProductContainer().add(flyingMachine);
}
} catch (ClassNotFoundException | EOFException e) {
e.printStackTrace();
} finally {
if (objectInputStream != null) {
objectInputStream.close();
fileInputStream.close();
}
}
}
public void multyWrite(int number) throws IOException {
for (int i = 0; i < number; i++) {
try {
fileOutputStream = new FileOutputStream(fileName, true);
objectOutputStream = new ObjectOutputStream(fileOutputStream);
for (FlyingMachine f : productService.getProductContainer()) {
objectOutputStream.writeObject(f);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
objectOutputStream.flush();
objectOutputStream.close();
}
}
}
}
答案 0 :(得分:1)
您在构造函数中创建一个新的ObjectOutputStream
。在writeFile
中,使用该OOS
实例并关闭它。但是在multyWrite
中,您不用它,而是创建新实例。
现在,当您在没有先调用multyWrite
的情况下调用writeFile
时,第一个OOS
仍将处于打开状态,但是您在OOS
中创建的multyWrite
不会打开不知道-这样会使您的文件具有两个OOS
头文件。
然后,当您尝试读取这样的文件时,ObjectInputStream
将找到第一个标头(一切都很好),然后意外地找到第二个标头,同时它期望输入类型代码。该标头以0xAC
开头,因此引发异常消息“无效类型代码:AC” 。
要解决此问题,请与multyWrite
一样使用OOS
使用构造函数中构造的writeFile
,或在您使用之前确保OOS
已关闭创建一个新的。
在构造函数中打开(任何类型的)流,然后依靠外部代码调用特定方法将其关闭通常不是一个好主意。更好地在需要时创建流并直接将其关闭。