[英]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數組中。 我開始從向量數組中獲取一個一個地顯示它們,如下所示
Person data = new Person();
int i=0;
data = vector[i++];
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.