データベースからではなくURLからバイナリデータを取得するように古いコードを更新しています(データはデータベースから移動されようとしており、代わりにHTTPでアクセスできるようになります)。データベースAPIは、データを生のバイト配列として直接提供しているようで、問題のコードは、BufferedOutputStreamを使用してこの配列をファイルに書き込みました。
私はJavaにまったく精通していませんが、少しグーグルすると次のコードにたどり着きました。
URL u = new URL("my-url-string");
URLConnection uc = u.openConnection();
uc.connect();
InputStream in = uc.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
final int BUF_SIZE = 1 << 8;
byte[] buffer = new byte[BUF_SIZE];
int bytesRead = -1;
while((bytesRead = in.read(buffer)) > -1) {
out.write(buffer, 0, bytesRead);
}
in.close();
fileBytes = out.toByteArray();
これはほとんどの場合機能するようですが、コピーされるデータが大きい場合に問題が発生します。古いコードで正常に機能したデータ項目に対してOutOfMemoryErrorが発生します。
これは、このバージョンのコードには同時にメモリ内にデータの複数のコピーがあるのに対し、元のコードにはないためだと思います。
メモリ内の複数のコピーのコストを発生させることなく、URLからバイナリデータを取得してファイルに保存する簡単な方法はありますか?