ObjectInputStream和二进制数据

时间:2015-05-13 01:11:56

标签: java binary objectinputstream

我在使用二进制文件加载应用程序时出现问题。我试图从二进制文件中读取并将数据注入我的应用程序中的一些HashMaps / ArrayLists。

public void loadBinary(String filename) {
    InputStream input = getClass().getResourceAsStream(filename);
    try (ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(input))) {

         // TODO

    } catch (IOException | ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
}

它指向相当长的行

try (ObjectInputStream in ... ) {

是它抛出异常的地方。

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Stream closed

他们如何“打开”流/修复此问题?谢谢!

编辑:

更多错误

Caused by: java.io.IOException: Stream closed
at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:159)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2313)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2326)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2797)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at model.Model.loadBinary(Model.java:245)
... 7 more

2 个答案:

答案 0 :(得分:2)

来自BufferedInputStream.getInIfOpen() [版权所有(c)2006,Oracle和/或其关联公司。保留所有权利。] [在合理使用下引用]:

private InputStream getInIfOpen() throws IOException {
    InputStream input = in;
    if (input == null)
        throw new IOException("Stream closed");
        return input;
    }

非常奇怪的代码。它应该抛出NullPointerException.可能它正在重载null以表示关闭,这是不好的做法。

无论如何,这都是导致问题的原因。资源未找到,因此input为空。您应该在创建ObjectInputStream.

之前检查过该内容

答案 1 :(得分:0)

我现在解决了。问题非常愚蠢,但仍然存在问题。

当我将方法二进制文件作为文件时,路径应为“folder / sub-folder / file.bin”,但作为InputStream,它应该只读“/sub-folder/file.bin”。 / p>

任何人都可以详细说明为什么它的结构如此?