从二进制文件对象中读取

时间:2011-12-03 22:02:50

标签: java file-io

我必须从二进制文件中读取一系列对象。

我用:

ObjectOutputStream obj = new ObjectOutputStream(new FileInputStream(fame));

obj.readObject(p);

其中p是对我创建的对象的引用。我怎样才能读到整个文件直到最后?

我可以使用:

while(p!=null){}

5 个答案:

答案 0 :(得分:2)

当且仅当您撰写readObject()时,

null才会返回null。正确的方法是捕获EOFException,然后当它关闭流并退出读取循环时。

答案 1 :(得分:1)

我们假设您的意思是ObjectInputStreamp = 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时抛出异常。因此,为了安全起见,请使用集合。

您可能还想阅读ObjectInputStreamObjectOutputStream上的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可以满足您的需求,如果代码中的fameFile,那么

import com.google.common.io.Files;

...

byte[] fameBytes = Files.toByteArray(fame);