ImageIO.Read关闭输入流



我将图像和其他数据写入二进制文件。当我通过ImageIO.read(InputStream)从该文件读取图像时,它读取图像,这是可以的,但是方法关闭给定的输入流,我不能继续读取其他数据。

  1. 为什么这么做?
  2. 那么如何在不关闭流的情况下读取图像?

EDIT:这是一个简单的代码,将图像和字符串写入文件:

File f = new File("test.bin");
if(f.exists())
f.delete();
f.createNewFile();
DataOutputStream os = new DataOutputStream(new FileOutputStream(f));
BufferedImage img = ImageIO.read(new File("test.jpg"));
ImageIO.write(img, "jpg", os);
os.writeUTF("test string after image");
os.close();

和读取所有的代码:

DataInputStream is = new DataInputStream(new FileInputStream(f));
BufferedImage img = ImageIO.read(is);
String s = is.readUTF(); // on this line EOFException occurs
System.out.println(s);

NetBeans输出:

Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
at java.io.DataInputStream.readUTF(DataInputStream.java:589)
at java.io.DataInputStream.readUTF(DataInputStream.java:564)
at mediamanager.Main.test(Main.java:105)
at mediamanager.Main.main(Main.java:44)

可能是我做错了什么?

引自ImageIO.read(InputStream)的文档

此方法在读取操作完成后不会关闭所提供的InputStream;如果需要,调用方有责任关闭流。

强调不是 mine.

问题在别处。可能在你的代码中。

我可以看到两个可能的原因:

  1. 图像阅读器使用缓冲区从流中读取数据以提高性能。所以它从流中读取更多数据。
  2. 此外,图像阅读器可以尝试读取已解析图像的EXIF。这些信息通常附加在文件的末尾,以避免当您只是添加一些关于图像的信息时重写整个文件。

试试ImageIO.setUseCash(false),可能会有帮助。

相关内容

  • 没有找到相关文章