我必须从二进制文件中读取一系列对象。
我用:
ObjectOutputStream obj = new ObjectOutputStream(new FileInputStream(fame));
obj.readObject(p);
其中p
是对我创建的对象的引用。我怎样才能读到整个文件直到最后?
我可以使用:
while(p!=null){}
答案 0 :(得分:2)
readObject()
时, null
才会返回null
。正确的方法是捕获EOFException
,然后当它关闭流并退出读取循环时。
答案 1 :(得分:1)
我们假设您的意思是ObjectInputStream
和p = obj.readObject()
。
<击> 我会做这样的事情:(这是错误的,请参阅下面的编辑)
FileInputStream fstream = new FileInputStream(fileName);
try {
ObjectInputStream ostream = new ObjectInputStream(fstream);
while (ostream.available() > 0) {
Object obj = ostream.readObject();
// do something with obj
}
} finally {
fstream.close();
}
击> <击> 撞击>
修改强>
我把它拿回来! EJP正确地指出available()
的使用在这里是不正确的。我认为固定代码可能是:
FileInputStream fstream = new FileInputStream(fileName);
try {
ObjectInputStream ostream = new ObjectInputStream(fstream);
while (true) {
Object obj;
try {
obj = ostream.readObject();
} catch (EOFException e) {
break;
}
// do something with obj
}
} finally {
fstream.close();
}
虽然readObject()
的文档没有明确说明在流的末尾抛出EOFException
,但它似乎是隐含的,可能是检测流结束的唯一方法
如果你控制编写流的代码的另一个选择是在开头写一个对象计数,或者在每个对象之后写一个标志来指示前一个对象是否是最后一个。
答案 2 :(得分:1)
如果您想将对象读入您的程序,则必须使用ObjectInputStream
,而不是ObjectOutputStream
。
如果你要存储一堆对象,那么使用适当的Collection来写入文件并从中读取。 readObject的API文档未声明它将返回null或在达到EOF时抛出异常。因此,为了安全起见,请使用集合。
您可能还想阅读ObjectInputStream和ObjectOutputStream上的API文档。
答案 3 :(得分:0)
Boolean i = true;
while(i) {
try {
System.out.println(reader.readObject());
} catch(Exception e) {
i = false;
System.out.println("Dead end");
}
}
答案 4 :(得分:-1)
Guava的Files.toByteArray
可以满足您的需求,如果代码中的fame
为File
,那么
import com.google.common.io.Files;
...
byte[] fameBytes = Files.toByteArray(fame);