Java ObjectInputStream和二进制数据

Java ObjectInputStream和二进制数据,java,binary,objectinputstream,Java,Binary,Objectinputstream,我在用二进制文件加载应用程序时遇到问题。我试图从二进制文件中读取数据,并将数据注入应用程序中的一些HashMaps/ArrayLists public void loadBinary(String filename) { InputStream input = getClass().getResourceAsStream(filename); try (ObjectInputStream in = new ObjectInputStream(new BufferedInputSt

我在用二进制文件加载应用程序时遇到问题。我试图从二进制文件中读取数据,并将数据注入应用程序中的一些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
原因:java.io.IOException:流已关闭
位于java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:159)
在java.io.BufferedInputStream.fill处(BufferedInputStream.java:246)
位于java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
在java.io.BufferedInputStream.read处(BufferedInputStream.java:345)
位于java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2313)
在java.io.ObjectInputStream$PeekInputStream.readFully处(ObjectInputStream.java:2326)
位于java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2797)
位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
位于java.io.ObjectInputStream。(ObjectInputStream.java:299)
位于model.model.loadBinary(model.java:245)
... 还有7个

我现在解决了。这个问题很愚蠢,但却是个问题

当我将二进制文件作为文件提供给该方法时,路径应该是“folder/sub folder/file.bin”,但作为输入流,它应该只读取“/sub folder/file.bin”


有人能解释一下为什么它的结构是这样的吗?

来自
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
,以指示关闭,这是一个糟糕的做法


无论如何,这就是你问题的原因。找不到资源,因此
输入
为空。在创建
ObjectInputStream之前,您应该已经检查了这一点。

您可以在TODO部分发布您在做什么吗?它与
InputStream无关。
它与资源的正确命名有关。当您使用
getClass().getResourceAsStream(),
资源是相对于类的包命名的;如果像这里一样使用绝对路径,那么它是相对于类路径的根的。在这两种情况下都与
文件夹
无关。