1

以下のコードを使用して、http 経由でリモートの場所からファイルをダウンロードしています。一部のアセットが完全にダウンロードされておらず、破損しているようです。5%くらいの確率であるそうです。事前にファイル サイズを取得し、ダウンロードしたものと比較して、見落としがないことを確認して、完全なファイルをダウンロードしたことを確認することをお勧めします。

いくつかの Google 検索で、既に作業しているオブジェクトを調べても、このファイル サイズを取得する明確な方法がわかりません。誰かが私を正しい方向に向けることができますか?

HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setInstanceFollowRedirects(true);

InputStream is = con.getInputStream();
file = new File(destinationPath+"."+remoteFile.getExtension());

BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath()));
while ((i = bis.read()) != -1) {
   bos.write(i);
}
bos.flush();
bis.close();
4

3 に答える 3

3

con.getContentLength() 必要なものが得られる場合がありますが、サーバーがそれを応答ヘッダーとして提供した場合のみです。サーバーが Content-Length ヘッダーを提供する代わりに「チャンク」エンコーディングを使用した場合、全体の長さは前もって利用できません。

于 2013-07-29T15:16:49.477 に答える
1

から継承するgetContentLength()メソッドhere を確認してください。HttpURLConnectionURLConnection

于 2013-07-29T15:16:34.223 に答える
0

InputStream#available()メソッドを使用できます。

この入力ストリームのメソッドの次の呼び出しによってブロックされることなく、この入力ストリームから読み取る (またはスキップする) ことができる推定バイト数を返します。

次の呼び出しは、同じスレッドまたは別のスレッドである可能性があります。このバイト数の 1 回の読み取りまたはスキップはブロックされませんが、より少ないバイト数の読み取りまたはスキップが行われる可能性があります。

FileInputStream fis = new FileInputStream(destinationPath+"."+remoteFile.getExtension());
System.out.println("Total file size to read (in bytes) : "+ fis.available());
于 2013-07-29T15:20:06.303 に答える