Java ObjectInputStream和二进制数据
我在用二进制文件加载应用程序时遇到问题。我试图从二进制文件中读取数据,并将数据注入应用程序中的一些HashMaps/ArrayListsJava 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
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(),
资源是相对于类的包命名的;如果像这里一样使用绝对路径,那么它是相对于类路径的根的。在这两种情况下都与文件夹
无关。