2017-02-21 55 views
1

我試圖下載一個主機提供的一些圖像。這是我使用的方法:下載Piktogramms時太大的文件

public static void downloadImage(String imageLink, File f) throws IOException 
{ 
    URL url = new URL(imageLink); 
    byte[] buffer = new byte[1024]; 
    BufferedInputStream in = new BufferedInputStream(url.openStream(), buffer.length); 
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(f), buffer.length); 

    while (in.read(buffer) > 0) 
     out.write(buffer); 
    out.flush(); 
    out.close(); 
    in.close(); 
} 

但是,文件變得太大了。我認爲5MB的80x60 JPG太多了。

這可能是什麼原因造成的?

+1

請你幫個忙,並使用庫這一點。我最喜歡的流副本是Apache Commons IOUtils(https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html#copy(java.io。 InputStream,%20java.io.OutputStream)) –

+1

不客氣;感謝您的快速接受。 – GhostCat

+1

和旁註;我同意托馬斯的觀點:除非這是一個「教育練習」 - 你最好用一些圖書館來做到這一點。 – GhostCat

回答

1

你在這裏做的錯了:read()返回真正被讀取的字節數;因此您必須將您的緩衝區陣列中的那個數字寫入您的輸出流。

您的代碼正在破壞您的輸出;並簡單地寫出一個緩衝區數組......主要由0組成!

而是做這樣的事情:

int bytesRead; 
while ((bytesRead = in.read(buffer)) > 0) { 
    byte outBuffer[] = new byte[bytesRead]; 
    ... then use arraycopy to move bytesRead bytes 
    out.write(outBuffer); 
} 

(這意味着爲靈感讓你去,更喜歡僞不是真正的代碼)

+0

謝謝。我會確保記住這個事實 –