读取二进制文件直到结束

时间:2011-12-04 00:02:21

标签: java file

我将一系列不同的对象序列化为二进制文件。如何将文件读取到最后?

    try {
        ObjectInputStream reader = new ObjectInputStream(new FileInputStream(fname));

        Object obj = reader.readObject(); 

        if (obj instanceof Azienda) {
            Azienda a = (Azienda) obj;
            company.put(a.getCod(), a);
        } else if (obj instanceof Privato) {
            Privato p = (Privato) obj;
            privato.put(p.getCod(), p);
        }
    } catch (ClassNotFoundException cnfe) {
        cnfe.printStackTrace();
    } catch (FileNotFoundException ffe) {
        System.err.println("Error: the file was not found!");
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }

这样我每次读取只读一次对象。

当我阅读文本文件时,我使用null

4 个答案:

答案 0 :(得分:4)

try{
    while(true) {
       Object obj=reader.readObject()
     // do sth with object
    }
}catch(EOFException e){
//we expect it so ignore
}

除了异常,当您为ObjectInputStream读取它时,除了异常之外没有EOF检查,因此您将不得不使用称为控制流异常的代码气味

答案 1 :(得分:1)

    ObjectInputStream reader = null;

    try {
        reader = new ObjectInputStream(new FileInputStream("sth"));

        Object obj = null;
        while ((obj = reader.readObject()) != null) {
            System.out.println(obj);
        }


    } catch (EOFException e) {
        System.out.println("finnished reading");
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } catch (FileNotFoundException ex) {
        System.err.println("Error: the file was not found!");
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        reader.close();
    }

答案 2 :(得分:1)

当没有更多对象要从流中读取时,似乎抛出了EOFException。不幸的是,它甚至没有记录。所以,我看到以下解决方案:

  • 你读到一个循环,直到你得到这个例外,
  • 你这样做是为了让你事先知道流中的对象数量,
  • 你做的就是有一个标记对象,它标记了流的最后一个对象,
  • 序列化(和反序列化)一个唯一对象:包含所有对象的List<Object>。最后一个解决方案当然可以防止将对象动态写入流中,并强制您在序列化之前将所有对象都放在内存中。

答案 3 :(得分:1)

ObjectInputStream没有用于检查文件结尾的具体方法。

read...()的每个ObjectInputStream方法在尝试读取文件末尾时会抛出EOFException。不幸的是,readObject()没有明确记录,但它适用于所有其他方法(readInt()等。)

http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html