ObjectInputStream 和二进制数据
ObjectInputStream and Binary Data
我在使用二进制文件加载我的应用程序时遇到问题。我正在尝试从二进制文件中读取数据并将数据注入我的应用程序中的某些 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
我怎么"open"stream/fix这个问题?谢谢!
编辑:
更多错误
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
我现在解决了。这个问题很愚蠢,但仍然是一个问题。
当我将二进制文件作为文件提供给方法时,路径应该是 "folder/sub-folder/file.bin",但作为 InputStream,它应该只读为“/sub-folder/file.bin”。
任何人都可以详细说明为什么它的结构是这样的吗?
来自 BufferedInputStream.getInIfOpen()
[版权所有 (c) 2006,Oracle and/or 其附属公司。保留所有权利。][根据合理使用引用]:
private InputStream getInIfOpen() throws IOException {
InputStream input = in;
if (input == null)
throw new IOException("Stream closed");
return input;
}
非常奇怪的代码。它应该抛出一个 NullPointerException.
可能它正在重载 null
以指示关闭,这是不好的做法。
在任何情况下,这都是您遇到问题的原因。未找到资源,因此 input
为空。您应该在创建 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
我怎么"open"stream/fix这个问题?谢谢!
编辑:
更多错误
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
我现在解决了。这个问题很愚蠢,但仍然是一个问题。
当我将二进制文件作为文件提供给方法时,路径应该是 "folder/sub-folder/file.bin",但作为 InputStream,它应该只读为“/sub-folder/file.bin”。
任何人都可以详细说明为什么它的结构是这样的吗?
来自 BufferedInputStream.getInIfOpen()
[版权所有 (c) 2006,Oracle and/or 其附属公司。保留所有权利。][根据合理使用引用]:
private InputStream getInIfOpen() throws IOException {
InputStream input = in;
if (input == null)
throw new IOException("Stream closed");
return input;
}
非常奇怪的代码。它应该抛出一个 NullPointerException.
可能它正在重载 null
以指示关闭,这是不好的做法。
在任何情况下,这都是您遇到问题的原因。未找到资源,因此 input
为空。您应该在创建 ObjectInputStream.