簡體   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