2017-02-21 5 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(); 
} 

ただし、ファイルが大きすぎます。 80x60のjpgのための5MBは私の意見ではあまりにも多いです。

この原因は何ですか?

+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

ありがとうございます。私はこの事実を覚えているでしょう –

関連する問題