【发布时间】:2014-05-30 22:41:27
【问题描述】:
我有一个数据结构中定义的一些对象的列表: 列表 > someObject1=new ArrayList();
我已经使用函数 writeData 将一些对象项写入文件XY:
void writeData(List <List<Integer>> someObject1, File XY) throws IOException {
try(ObjectOutputStream outFile = new ObjectOutputStream(new FileOutputStream(XY,true)))
outFile.writeObject(someObject1);
}
catch( IOException ex) { ex.printStackTrace(); }
}
现在我尝试使用函数 readData 读取它:
void readData(File XY) throws IOException {
try (ObjectInputStream inFile=new ObjectInputStream(new FileInputStream(XY))) {
List <List <MyClass>> someObject2=(List <List <MyClass>>)inFile.readObject();
}
catch( IOException ex) { ex.printStackTrace(); }
}
但它给了我错误:
java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1363)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
谁能帮帮我。读取此数据结构时,转换是否有问题?
如果它只是一个对象列表,我可以通过使用 readObject() 转换来读取它
(List<MyClass>).
为什么同样的事情对对象列表不起作用?
这是 MyClass 的大纲:
public class MyClass implements Serializable {
private long aa;
private List <Integer> bb;
public MyClass(long a,List <Integer> b) {
aa=a;
bb=b;
}
public long getA() {
return aa;
}
public List<Integer> getB () {
return bb;
}
}
【问题讨论】:
-
你能把关闭
outFile的代码包含进去吗? -
能不能把'MyClass'的相关部分也包括进来?它有自定义的 readObject()/writeObject() 方法吗?如果有,请展示给他们看。
-
写/读后不要忘记关闭
ObjectOutputStream和ObjectInputStream! -
你的代码实际上并没有编译。如果您尝试追加到对象流文件,则不能,至少在没有特殊处理的情况下不能,否则您将在文件中间写入重复的流标头。但这通常会导致带有“无效类型代码:AC”的 StreamCorruptedException。并且不关闭文件通常会导致 EOFException。所以我的钱花在了自定义序列化方法中的一些奇怪的东西上。这不可能是演员阵容,因为你还没有做到这一点。
-
@Kaur
try只有在try-with-resource这样的情况下才会隐式关闭它:try(stream declaration) { code }
标签: java arraylist io objectinputstream objectoutputstream