データベースからではなくURLからいくつかのバイナリデータを取得するために古いコードを更新しています(データはデータベースから移動され、代わりにHTTPでアクセス可能)。データベースAPIはデータを生のバイト配列として直接渡していたようで、問題のコードはこの配列をBufferedOutputStreamを使ってファイルに書き出しました。バイナリデータをJavaのURLから中間のコピーなしでファイルにコピーする
私は、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からバイナリデータを取得してメモリに複数のコピーを作成せずにファイルに保存する簡単な方法はありますか?
はい、D'ああ。私は今私が間違った質問をここで完全に尋ねたことに気づきます。私がデータを配列にコピーした唯一の理由(私が完全に忘れた)は、その長さを見つけることでした。これは長い話ですが、後続のファイル記述コードではファイルを作成する前にデータ長が必要です。 とにかく、あなたの答えを受け入れる...それは私が尋ねたことを行います:) –
@ルーク:その後、ファイルを書くコードを修正すると言います。 –
URLConnection.getContentLength()を使用して、バッファリングする代わりにデータの長さを調べることができます。 – laz