0

Web サーバーからファイルをダウンロードするアプリケーションを Java で作成しています。このファイルは 816kb の zip ファイルです。3 台の異なるコンピューターでアプリケーションをテストしましたが、1 台のコンピューターでは動作しません。その場合、ファイルの 13kb のみをダウンロードしてから停止します。htaccess ログを確認すると、次のように表示されます。

a: "GET /cache.zip HTTP/1.1" 200 816938 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_07"

b: "GET /cache.zip HTTP/1.1" 200 134320 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_09"

(PC a は動作し、PC b は動作していません)

Javaでファイルをダウンロードするためにさまざまな方法を試しましたが、すべての方法で13kbを超えるとダウンロードが停止します。また、512m メモリでアプリケーションを実行しようとしましたが、それは問題ではありません。

これは私が今持っているものです:

DataInputStream in = new DataInputStream(conn.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream(new File(Config.CACHE_DIR+File.separator+"cache.zip")));
byte[] data = new byte[1024];

while((count = in.read(data,0,1024)) >= 0){
    out.write(data, 0, count);
}

しかし、このwhileループは止まらないので、スタックしますin.read

4

2 に答える 2

0

私は通常、ストリーム間のコピーにApache Commons IO IOUtils.copy()を使用します。バッファを使用して、あるストリームから別のストリームにバイトをコピーします。

ちなみに、あなたの場合、DataInputStreamラッパーとDataOutputStreamラッパーを使用する必要はありませ。InputStreamとFileOutputStreamを直接使用できます。

IOUtilsを使用すると、コードは次のようになります。

InputStream in = conn.getInputStream();
File outputFile = new File(Config.CACHE_DIR + File.separator + "cache.zip");
OutputStream out = new FileOutputStream(outputFile);
try {
    IOUtils.copy(in, out);
} finally {
    output.close();
}

IOUtilsを使用したくない場合...

int count;
byte[] data = new byte[1024];
while ((count = in.read(data)) > 0) {
     out.write(data, 0, count);
}
于 2012-10-28T16:16:41.610 に答える
0

簡単なスタンドアロン テストを実行して、問題がソフトウェアではなく PC にあることを確認します。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class Scratch {

public static void main(String[] args) throws IOException {
    URL url = new URL("http://url.to.zip");

    InputStream in = url.openStream();
    FileOutputStream out = new FileOutputStream("test.zip");
    byte[] buffer = new byte[1024];
    int read = 0;
    while ((read = in.read(buffer)) >= 0) {
        out.write(buffer, 0, read);
    }
}

}
于 2012-10-28T16:48:47.617 に答える