OSSからダウンロードしたファイルの偶発的なファイルの内容が空です。


背景:  urlを使ってhttp Clientのget方法を通して、ossからpdfファイルをダウンロードして、ダウンロードされたファイルはブラウザを通じて正常に調べてダウンロードすることができます。
問題:  たまにダウンロードしたファイルが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);
    }
}
分析プロセス:
  •  FileOutputStreamはflushメソッドを起動していないので、データがキャッシュエリアからシステムに読み込まれていないと、出力ストリームを閉じてしまい、ファイルが0 KBとなります。その結果、解析ミスを発見しました。ソースを調べてflush方法はOutputStreamの方法です。FileOutputStreamはOutputStreamを引き継いでflush方法を書き換えていないので、FileOutputStreamは直接システムキャッシュに書き込みます。
  •  資料を見ることによって、出力フローの持続化ファイルは非同期のプロセスであることが分かりました。まず出力ストリームはバイトをシステムキャッシュに書き込み、システムキャッシュはそのまま書き込み結果に戻ります。そして、システムキャッシュは、コンテンツを永続化するために並んでいます。このプロセスを同期プロセスに変えてもいいですか?答えは大丈夫です。出力ストリームを呼び出すFileOutputStream.getFD().sync()方法により、ファイルの恒久化を待って結果が戻る。これで問題は解決される。
  •       注意:FileOutputStream.getFD().sync()同期方法を使用すると、ファイルの書き込みの性能に大きな影響を与えます。使う必要があるかどうかは、具体的な業務によって判断します。