FileInputStream.available()返回字节,但ObjectInputStream.available()返回0

时间:2017-01-15 19:09:42

标签: java file stream inputstream objectinputstream

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

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

EOFException:“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();

1 个答案:

答案 0 :(得分:1)

这是javadoc所说的

  

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

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