2011-02-23 30 views
0

私はコードのメモリ最適化に取り組んでいます。画像ファイルを他のコンピュータに転送する役割を担う。画像ファイルは240Mbで、現在のアプリケーションのヒープサイズは1536Mbです。StringBuilderを使用する際の問題

現在のコードは

byte[] buf = new byte[size]; 

while ((num = is.read(buf)) > 0) { 
... 
String str = new String(buf, 0, num)); 
... 
sendToPc(str); 
} 

これは、文字列オブジェクトの多くを作成し、私は5つ以上のPCのにイメージをプッシュしようとすると、それは、ヒープを使い果たしています。だから私は

(私は同期を気にしない)文字列ビルダを使用するのではと思ったが、文字列ビルダは

byte[] buf = new byte[size]; 
StringBuilder str = new StringBuilder(size); 
while ((num = is.read(buf)) > 0) { 
... 
str.insert(0,buf); --> Apparently can not append byte array. 
... 
str.delete(0, str.length()); 
} 

のようなバリエーションを持っていないと私はstr.insert(0,new String(buf, 0, num))を試しても、それはどんな違いがありません。

私は文字列ビルダーや文字列バッファーを使用することができないので、どのようにオブジェクトの数を絞ることができます。

よろしく

Dheeraj女子

答えて

1

IOUtilsapache common ioライブラリからお試しください。大きなファイルをコピーする方法を提供します。同じトピックで、「肥満の原因、健康の限界」という論文は本当に有益である。

1

あなたはStringとしてsendToPcに画像を送信するために必要されていますか?いくつかのByteBufferはあなたのニーズをよりよく満たす可能性があります...

+0

はい。それは必須です。実際には。 SendToPcメソッドはさらに2つのメソッドを呼び出し、最後にそれを転送します。だから私は送信部分を変更することはできません。だから私は計算部分で何かを絞る必要があります。 –

1

バイナリデータを保持するために文字列を使うべきではありません。文字列には文字が含まれます。バイト配列を引数として取るStringコンストラクタを呼び出すと、プラットフォームのデフォルトのcharsetに基づいて文字列を作成します。これは、バイトをcharに変換します。 javadocが

与えられたバイトは デフォルトの文字セットでは有効ではありません。このコンストラクタの動作

また指定されていないと言って、送信するプラットフォームのデフォルトの文字セットは、必ずしも同じではありません受信プラットフォームの1つ。

単純にバイトをバイト配列として転送しないのはなぜですか?

+0

問題は、他の一部のPCでこの画像を受け取るコードが、バイト配列ではなく文字列を受け入れることだけです。そして、私はそれを支配しません。 –

関連する問題