ImageIO.read关闭输入流

时间:2014-06-21 21:11:48

标签: java image stream

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

  1. 为什么这样呢?
  2. 然后如何在不关闭流的情况下读取图像?
  3. 编辑:这是将图像和字符串写入文件后的简单代码:

    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)
    

    可能我做错了什么?

2 个答案:

答案 0 :(得分:4)

引用ImageIO.read(InputStream)

的文档
  

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

强调我的。

问题出在其他地方。可能在你的代码中。

答案 1 :(得分:0)

我可以看到这种行为的两个可能原因:

  1. 图像阅读器使用缓冲区从流中读取数据以提高性能。所以它从流中读取更多数据。
  2. 图像阅读器也可以尝试为已经解析的图像读取EXIF。这些信息通常附加在文件末尾,以避免在您添加有关图像的一些信息时进行完整的文件重写。
  3. 尝试ImageIO.setUseCash(false)它可以提供帮助。