使用StringBuilder时出现问题

时间:2011-02-23 08:45:17

标签: optimization memory stringbuilder

我正在研究一段代码的内存优化。负责将图像文件传输到其他计算机。映像文件为240Mb,当前应用堆大小为1536Mb。

目前的代码是

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 Joshi

3 个答案:

答案 0 :(得分:1)

您是否需要将sendToPc中的图像作为字符串发送?一些ByteBuffer将更好地满足您的需求......

答案 1 :(得分:1)

您不应该使用字符串来保存二进制数据。字符串包含字符。当您以字节数组作为参数调用String构造函数时,您将基于平台的默认字符集构建字符串,该字符串将字节转换为字符。 javadoc说

  

此构造函数的行为   给定的字节在。中无效   默认字符集未指定

此外,发送平台的默认字符集不一定与接收平台的字符集相同。

为什么不简单地将字节作为字节数组传输?

答案 2 :(得分:1)

您可以尝试IOUtils库中的apache common io。它提供了复制大文件的方法。在同一主题上,论文“膨胀的原因,健康的限度”是非常有益的。