OSSからダウンロードしたファイルの偶発的なファイルの内容が空です。
背景: urlを使ってhttp Clientのget方法を通して、ossからpdfファイルをダウンロードして、ダウンロードされたファイルはブラウザを通じて正常に調べてダウンロードすることができます。
問題: たまにダウンロードしたファイルが0 KBの場合があります。
コード: FileOutputStreamはflushメソッドを起動していないので、データがキャッシュエリアからシステムに読み込まれていないと、出力ストリームを閉じてしまい、ファイルが0 KBとなります。その結果、解析ミスを発見しました。ソースを調べてflush方法はOutputStreamの方法です。FileOutputStreamはOutputStreamを引き継いでflush方法を書き換えていないので、FileOutputStreamは直接システムキャッシュに書き込みます。 資料を見ることによって、出力フローの持続化ファイルは非同期のプロセスであることが分かりました。まず出力ストリームはバイトをシステムキャッシュに書き込み、システムキャッシュはそのまま書き込み結果に戻ります。そして、システムキャッシュは、コンテンツを永続化するために並んでいます。このプロセスを同期プロセスに変えてもいいですか?答えは大丈夫です。出力ストリームを呼び出すFileOutputStream.getFD().sync()方法により、ファイルの恒久化を待って結果が戻る。これで問題は解決される。 注意:FileOutputStream.getFD().sync()同期方法を使用すると、ファイルの書き込みの性能に大きな影響を与えます。使う必要があるかどうかは、具体的な業務によって判断します。
問題: たまにダウンロードしたファイルが0 KBの場合があります。
コード:
GetMethod httpGet = new GetMethod(strUrlPath);
InputStream in = null;
FileOutputStream out = null;
try {
HttpClient httpClient = new HttpClient();
httpClient.executeMethod(httpGet);
in = httpGet.getResponseBodyAsStream();
out = new FileOutputStream(new File(strLocalPath));
byte[] b = new byte[1024];
int len = 0;
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
}
in.close();
out.close();
} catch (Exception e) {
log.error("httpClient ", e);
} finally {
httpGet.releaseConnection();
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch (Exception e1) {
log.error(" ", e1);
}
}
分析プロセス: