0

入力ストリームを取得するために Android 用の SpringFramework を使用しています。

    @Override
    public InputStream getImageStream(String url) {

    InputStream is = new ByteArrayInputStream(template.getForObject(url, byte[].class));

    return is;

}

最初のいくつかの入力ストリームでは問題ありません。まったく問題はありませんが、非常に大きな入力ストリームを取得しようとしていると思います。そのため、メモリ不足エラーが発生します。

次のコードのようなものを使用した投稿がたくさん見られます。

public byte[] readBytes(InputStream inputStream) throws IOException {

      ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

      int bufferSize = 1024;
      byte[] buffer = new byte[bufferSize];

      int len = 0;
      while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer.write(buffer, 0, len);
      }

      byte[] byteArray= byteBuffer.toByteArray();

      return byteArray;
}

このコードのアイデアは、入力ストリームをチャンクで読み取ることですよね?

しかし、私が取得しているメモリ不足エラーは、readBytes メソッドを開始する前です。どこにでもリセットを入れてみました... readbytes などの後にどこかでメモリをクリアする必要があると思いました。しかし、私はその方法がわかりませんし、それが正しい方法であるかどうかもわかりません。

私は基本的なことを間違っていると思いますか?私はAndroidとJavaが初めてです...別の方法でInputStreamを取得する方法はありますか? BufferedInputStream についても読みましたが、それに適合する方法が思いつきません。

私の目標は、画像のブロブをデータベースに保存することです。そして、私の入力は oauth 経由の imgurl です。

別の URL から入力ストリームの品質の低いバージョンを呼び出すこともできます。そして、すべてが機能します...しかし、後で写真を印刷するためにオリジナルをダウンロードできるようにしたいので、元の画像のURLで試してみたかったのです。

4

1 に答える 1

0

使用時にメモリ内のデータ全体を読み取るため、OutOfMemory エラーが発生していますByteArrayInputStream。また、書き込むと、データもメモリに保持されることに注意してくださいByteArrayOutputStream(バイト配列の単純なラッパーです)。FileOutputStreamおそらく、代わりにキャッシュとして使用する必要があります。

于 2013-08-07T22:44:19.493 に答える