2017-12-20 13 views
2

私は最終的にバイト配列に変換し、キャッシュに書き込まれるに書き込まれた大量のデータを持っているByteArrayOutputStreamは、している:ここで変換バイトストリームが

try { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     try (JsonGenerator jg = mapper.getFactory().createGenerator(baos)) { 
     for (Object result : results) { 
      jg.writeObject(result); 
     } 
     } 

     localCache.put(cacheKey, baos.toByteArray()); 
    } 
    catch (IOException e) { 
     throw Throwables.propagate(e); 
    } 

baos.toByteArray()が作成されます私が避けようとしているメモリ内のデータの完全なコピー。余分なメモリを使用せずにストリームをバイト配列に変換する方法はありますか?

+0

追加スペースが必要だと思います。 BAOSにコピーを作成させ、BAOSのバイト配列への参照を保持させるかどちらかを指定します。しかし、構築されたBAOSオブジェクトが破壊されることはないので、2番目のオプションは 'メモリリーク'を引き起こす可能性があります。 BAOSをlocalCacheに組み込むことができますか? – Veera

+0

残念ながら、localcacheはバイト配列しか受け付けません。 – seriousgeek

答えて

2

内部バッファと現在のカウントは、protectedのJavadocに記載されています。これは、ByteArrayOutputStreamをサブクラス化し、バッファに直接アクセスするためにbyte[] getBuffer()メソッドを提供することがOKであることを意味します。既存のsize()メソッドを使用して、データの量を判断します。

public class MyBAOS extends ByteArrayOutputStream 
{ 
    public MyBAOS()   { super(); } 
    public MyBAOS(int size) { super(size); } 
    public byte[] getBuffer() { return buf; } 
} 
関連する問題