2014-01-26 112 views
1

我從inputStream創建圖像,並使用了兩種方法,但兩種方法均失敗。Java從inputStream創建圖像

第1種方法:

FileOutputStream out=new FileOutputStream(file) 
byte[] byteBuffer = new byte[1024]; 
int length = 0; 
while ((stream != null) && ((length = stream.read(byteBuffer)) != -1)){ 
out.write(byteBuffer,0,length); 
} 
out.flush() 
out.close(); 
stream.close(); 

這種方法生成的圖像,但在嘗試打開它。它說「這不是有效的位圖文件」。

而第二方法:

BufferedImage imBuff = ImageIO.read(stream); 
ImageIO.write(imBuff, 'png', file); 

而這一次產生例外。

java.lang.IllegalArgumentException:image == null! 在javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpe cifier.java:925) 在javax.imageio.ImageIO.getWriter(ImageIO.java:1591) 在javax.imageio.ImageIO.write(ImageIO.java:1520) 在com.k12report.frontend.ClientAuthoringController $$ EOU2Lt2o.getImages( ClientAuthoringController.groovy:55) 在grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PAG eFragmentCachingFilter.java:195) 在Grails的。 plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter .java:63) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor。 java:1145) 在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(的ThreadPoolExecutor 的.java:615) 在java.lang.Thread.run(Thread.java:722)

感謝

+2

什麼是'stream'?它的內容是什麼?您是否嘗試將內容轉儲到磁盤並通過外部映像程序驗證其有效性? – MadProgrammer

+0

stream = response.getEntityInputStream() – Biswas

+2

你確定你有一個有效的圖像開始?在第二種方法中,'imBuff'爲'null',這在ImageIO不識別文件格式時發生。你需要測試這種情況。你的第一種方法對我來說很好。你可能應該在循環之外檢查'stream!= null'以獲得可讀性和性能。 – haraldK

回答

1

好,對於這不是一個有效的位圖文件

使用文件分割符是比較推薦的方式,而不是使用「\」或「/」如果你正在使用的文件的路徑,因爲它們依賴於OS.They使你的代碼更便攜。

例子: -

File f = new File("C:"+File.separator+"Personal"+File.separator+"test.bmp");

+0

順便說一句,有多少操作系統在開始時使用'C:'? –

+0

我正在使用grails,所以, 'def root = getServletContext()。getRealPath(「」); String path = root +'/ authoringImages /'+ images File file = new File(path);' – Biswas

+0

對我來說,使用**/**作爲文件分隔符工作** always **(使用File-Object時) ...當使用窗戶時...... – Ben