【问题标题】:FileInputStream.available() returns bytes but ObjectInputStream.available() returns 0FileInputStream.available() 返回字节,但 ObjectInputStream.available() 返回 0
【发布时间】:2017-05-30 15:08:33
【问题描述】:

我遇到了一个我似乎不明白的奇怪问题。 我正在制作一个从文件中读取数据的程序。但是当我读取数据时,我会立即收到 EOFException。

所以我用 .available() 检查了文件是否为空。我得到了一个奇怪的结果。 FileInputStream 表示文件已填充(249 字节),但 ObjectInputStream 表示文件为空(或无法读取)。

EOFException at: "int signatureSize = ois.readInt();"

        FileInputStream fin = new FileInputStream("input(signedbyLK).ext");
        System.out.println("fin available: " + fin.available());

        ObjectInputStream ois = new ObjectInputStream(fin);
        System.out.println("ois avaiable: " + ois.available());

        int signatureSize = ois.readInt();
        byte[] sigBytes = (byte[]) ois.readObject();
        String text = (String) ois.readObject();
        ois.close();

编辑:我正在向文件中添加这样的内容:

        File newFile = new File("input(signedbyLK).ext");
        newFile.createNewFile();

        System.out.println("Succesfully created new file: " + newFile.getName());

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(newFile));
        oos.writeObject(sigBytes.length);
        oos.writeObject(sigBytes);
        oos.writeObject(readInput());
        oos.close();

【问题讨论】:

    标签: java file stream inputstream objectinputstream


    【解决方案1】:

    这是javadoc所说的

    任何试图读取超出边界的对象数据的行为 对应的 writeObject 方法写入的自定义数据会导致 一个 OptionalDataException 被抛出,其 eof 字段值为 true。 超出分配数据末尾的非对象读取将 以同样的方式反映数据的结尾 流结束:按字节读取将返回 -1 作为字节读取或 读取的字节数,原始读取将抛出 EOFExceptions。如果 没有对应的writeObject方法,则默认结束 序列化数据标志着分配数据的结束。

    另外,您需要按照序列化时的顺序读取对象输入流

    【讨论】:

    • 我已经编辑了我的问题。现在你可以看到我填写文件的顺序了。
    • 您的读取调用甚至不对应于写入调用。您的第一次写入调用是一个对象,但您的第一次读取是一个 int
    • 哇,我什至没有注意到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多