0

大量のデータを xml として返す残りの Web サービスを呼び出す必要があります。データのサイズは約 490m です。サービスを呼び出そうとするたびに、メモリが不足します。私がしたいのは、このデータをファイルに書き込むことだけです。

メモリ不足を避けるために、データを小さなチャンクで読み書きする方法はありますか?

これが私が試したことです。

public class GetWs {

   private static String url ="http://somewebservice";
   public static void main(String[] args) {

    InputStream in;
    OutputStream out;
    try {
          out = new FileOutputStream("testoutfile.txt");
          in = new URL(url).openStream();
          int b;
          do {
               b = in.read();
               if (b != -1) {
            out.write(b);
                 out.flush();
               }
           } while (b != -1);
            in.close();out.close();     
    } catch (Exception e) {
        e.printStackTrace();
     }

   }

}
4

3 に答える 3

2

本当にその URL のコンテンツをファイルにダウンロードしたいだけなら、Google Guavaを試してみてください。これは素晴らしいヘルパー メソッドです。

URL url = ...
File file = ...
ByteStreams.copy(
    Resources.newInputStreamSupplier(url),
    Files.newOutputStreamSupplier(file));

これにより、適切な例外処理を使用してさらに別のコピー ループを作成する必要がなくなります。ストリームを閉じる必要さえありませByteStreams.copy()ん。

データを UTF-16 として保存する場合は、次のようにします。

Charset charsetFromServer = ...; // See notes below.

CharStreams.copy(
    Resources.newReaderSupplier(url, charsetFromServer),
    Files.newWriterSupplier(file, Charsets.UTF_16));

設定するにはいくつかの方法がありますcharsetFromServer:

  • サーバーが常に同じ文字セットを使用することを信頼できる場合はCharset.forName(String)、または Guava のCharsetsクラスの定数のいずれかを使用して手動で設定します。ただし、サーバーが他のエンコーディングを使用しないことを本当に、本当に確認してください。そうしないと、これが壊れます。

  • より複雑な方法は、Content-Typeヘッダーを見て、実行時にサーバーが使用する文字エンコーディングを判断することです。Apache の HttpClient がどのようにそれを行うかを確認するか、単に HttpClient を使用して開始することをお勧めしますContentType.getOrDefault(response.getEntity()).getCharset()

于 2012-06-06T14:18:20.753 に答える
1

本当に入力ストリームを使用している場合は、単に使用してください

byte[] buff = new byte[5000];
int num = 1;
while(num>1){
   num = inputStream.read(buff);
   outputStream.write(buff,0,num);
}

ファイルの終わりに到達したことを検出するコードを追加する必要がありますが ~~~(入力ストリーム依存の実装)~~~編集しないでください。コードを修正しました

于 2012-06-06T13:20:30.117 に答える