繁体   English   中英

ImageIO.read(InputStream)返回null

[英]ImageIO.read(InputStream) returns null

我面临一个找不到解决方案的问题。 所以请大家阅读。 请在这方面帮助我。

我正在将图像文件从“ .png”文件保存为Blob格式的apache derby db。 保存的文件没有任何问题。

要从德比回读,我首先以Blob的形式获取数据,然后将其转换为InputStream,然后使用以下代码将其存储到我创建的类“ Person”对象中

Blob patientPhoto = rs.getBlob("photo");

person.setPhoto(patientPhoto.getBinaryStream());

班级人员概述如下所示

 Public class Person {
    private String personName;
    private InputStream photo;

public void setPhoto(InputStream photo){
        this.photo = photo;
    }
Public InputStream getPhoto(){
    return photo;
    }
 }

最初,我将四个人的对象与图像一起存储在德比中。 然后,我从德比检索这四个人对象并将其存储到Vector数组中。 我开始从向量数组中获取一个一个地显示它们,如下所示

方法1:向量数组中人对象的初始化方法

Person data = new Person();

int i=0;

data = vector[i++];

方法2:显示人物照片的方法

InputStream img = data.getPhoto();

// The image recieved from db should be buffered as it is not real file
// but bytes of streams

BufferedImage buffImg = null
    if(img!=null){
      try {
        buffImg = ImageIO.read(img);
      } catch (IOException e) {
         e.printStackTrace();
      }

    //a panel with JLabel where Image will be displayed

    pnlImg.setImage(buffImg);
    }

try {
    img.close();
    } catch (IOException e) {
      e.printStackTrace();
    }

从索引为0到3的向量数组中检索到的所有四张照片都很好,但是当我尝试使人对象从索引2到0反向时,会引发空指针异常。 代码ImageIO.read(img); 当“ img”不为null时返回null值。

我无法理解为什么“ img”不为空时显示为空。 从向量索引0到3时,它工作,然后向后退,则不行。 请帮我

我相信Blob的InputStream仅在您当前位于该记录上时才有效。 因此,您不应期望从getBinaryStream()获得的值会长期保持有效。

取而代之的是,应用程序应在获取Blob后立即从流中读取字节,然后可以前进到结果集中的下一条记录。

因此,更改您的Photo类,以便setPhoto()方法将InputStream中的数据读取到其自己的字节数组中,然后可以在调用getPhoto()时将自己的ByteArrayInputStream返回到Photo的私有字节数组中。

我知道这是一篇过时的文章,但是如果您遇到类似的问题,可以尝试一下。 我也遇到了类似的问题,并且可以通过以下方式解决。 因此,您可以将Person类更改为:

Public class Person {
    private String personName;
    private BufferedImage photo;

    public void setPhoto(BufferedImage photo){
        this.photo = photo;
    }
    public BufferedImage getPhoto(){
        return photo;
    }

}

然后从blob中读取时,只需将Inputstream转换为BufferedImage,然后再将其设置为person对象,如下所示:

Blob patientPhoto = rs.getBlob("photo");
InputStream ins = patientPhoto.getBinaryStream();
person.setPhoto(ImageIO.read(ins));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM