StringBuffer .toString() 内存溢出 郁闷

dzy_pb 2009-08-28 10:13:44
最近在用 StringBuffer 导致内存溢出,用什么办法可以将StringBuffer 转换成 byte[] 然后在解码成 string.

InputStreamReader isr = new InputStreamReader(httpConn
.getInputStream(), "UTF-8");
BufferedReader in = new BufferedReader(isr);

String inputLine;
StringBuffer buffer = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
buffer.append(inputLine);
}
in.close();
isr.close();

return buffer.toString();
...全文
2248 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhongwei90 2011-08-23
  • 打赏
  • 举报
回复
StringBuffer 有最大限度不能用来存文件内容。文件内容超过StringBuffer最大容量就坏了
gaoch_2000 2009-09-02
  • 打赏
  • 举报
回复
StringBuffer()
构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(CharSequence seq)
public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuffer(int capacity)
构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
liboofsc 2009-08-29
  • 打赏
  • 举报
回复
String能容纳的最大长度比StringBuffer要小,所以。。。。
humanity 2009-08-29
  • 打赏
  • 举报
回复
如果知道处理的数据量大的话,就不要一次全收到才开始处理,
像你的程序从一个 HTTP 请求中接收数据,像 HEAD 之类的当然可以全收到才开始处理,但如果你发现了连续2 个换行就表示一个部分已经完了,比如一个 HEAD 已经完了,后面接下来的是内容,内容的长度在 HEAD 里面已经报告过了,我们知道大小就准备分配内存,如果是文件上传之类的数据,我们就用临时文件缓存它。

像你的程序在处理 HTTP 时不考虑 HEAD 中的大小直接把所有内容全收到后再 toString,然后再处理是不实际的做法。除非你知道每次请求只有很小的字节数并且用户是内部用户,他们都知道你的程序怎么约定的。

lcj_up 2009-08-29
  • 打赏
  • 举报
回复
.getBytes();
new String(byte[] byte)
日月小小 2009-08-28
  • 打赏
  • 举报
回复
加内存条!
musecangying007 2009-08-28
  • 打赏
  • 举报
回复
xuexi
小马迷途 2009-08-28
  • 打赏
  • 举报
回复
跟buffer没有关系,你一次读的内容太大了,所以oom

分多次读吧
sandyfish 2009-08-28
  • 打赏
  • 举报
回复
跟贴的
bigbug9002 2009-08-28
  • 打赏
  • 举报
回复
buffer中的字符太多了.

可以超过一定的大小,就换另一个buffer,前一个存盘.,并清除内容.两个倒替着做.
hxbot 2009-08-28
  • 打赏
  • 举报
回复
一行一行的读,那就读一行,写一行。

建议用一个1024的char型数组做为一个批次提交。

怎么连遇几个这样的题目。


参考代码

import java.io.*;

public class CopyDemo{
public static void main (String[] args) {
try{
//源文件
File file =new File("student_mdf.mdf");
FileInputStream input =new FileInputStream(file);
//输出
FileOutputStream output =new FileOutputStream("F:\\student_mdf.mdf");
//1024字节一个批次
byte [] byt =new byte[1024];
while (input.read(byt)!=-1){
output.write(byt);
}
output.close();
input.close();
}catch(Exception ex){
ex.printStackTrace();
}

}
}
dzy_pb 2009-08-28
  • 打赏
  • 举报
回复
buffer中的字符太多了.

可以超过一定的大小,就换另一个buffer,前一个存盘.,并清除内容.两个倒替着做.


你还是要用stringbuffer tostring 方法啊
Acharz 2009-08-28
  • 打赏
  • 举报
回复
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。
  如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何时只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来立竿见影的性能增益。

测试你字符串大小,而后看你的内存存储容量。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧