=========关于JAVA输入输出流,BufferedReader.readLine()方法效率的问题=========

hmilyld 2007-06-29 03:37:49
感觉readLine()是不是效率有点低?
当我读入数据的时候,如果这个数据中间没有换行,
那不就等于整个文件就只有1行?
我测试了下,读入一个网页的源代码,结果发现
读入这个网页的时候,耗费3秒多,
而把这些数据读出来的时候,用了40多S。
慢的厉害。
有没有替代的方法?只能这样一行一行的读入?

示例:

BufferedReader in = new BufferedReader(new InputStreamReader(u.openStream()));
StringBuffer cb = new StringBuffer();
String tempCode = "";
long t2 = System.currentTimeMillis();
System.out.println("读取网页内容耗时:"+String.valueOf(t2-t1));
// 把buffer内的值读取出来,保存到code中
while ((tempCode = in.readLine()) != null) {
cb.append(tempCode + '\n');
System.out.println(a);
}
in.close();
long t3 = System.currentTimeMillis();
System.out.println("保存代码用时:"+String.valueOf(t3-t2));
...全文
843 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqrqq 2007-06-29
  • 打赏
  • 举报
回复
>>>那如果我读入的东西如果没有装满这些区域的话,会不会一直在哪里就不动了?
不会,会返回,count会记载到底装满了多少bytes
wf100200 2007-06-29
  • 打赏
  • 举报
回复
关注 up
hmilyld 2007-06-29
  • 打赏
  • 举报
回复
这样,
也就是说,真正去读取这些内容的时候,
还是在readline哪里,一点一点的把数据读过来。
byte[] bs = new byte[1024 * 16];
这里就相当于设置成缓冲区的大小为 1024*16?
那如果我读入的东西如果没有装满这些区域的话,会不会一直在哪里就不动了?

还有,我现在用的读入一个网页的源代码,使用的是URL这个类,然后用
openStream读入内容。还有其他的方法吗?
zqrqq 2007-06-29
  • 打赏
  • 举报
回复
理解错误?当程序把这句
BufferedReader in = new BufferedReader(new InputStreamReader(u.openStream()));
这句执行勒以后,不就是把u.openStream()打开的东西都读入进来了吗?
如果没有的话,那真正的把内容装在buffer里面是在哪里?能说详细点吗?谢谢。

----------------------------------------------

执行这个语句之后,并没有把任何东西读到内存,而是在readline的之后,根据需要,一点一点的读入数据。但是readline的默认buffer很小,所以,速度并没有达到最高。通过自己写的代码,调节buffer大小后,读入速度可以进一步提高
hmilyld 2007-06-29
  • 打赏
  • 举报
回复
To ChDw(米):

理解错误?当程序把这句
BufferedReader in = new BufferedReader(new InputStreamReader(u.openStream()));
这句执行勒以后,不就是把u.openStream()打开的东西都读入进来了吗?
如果没有的话,那真正的把内容装在buffer里面是在哪里?能说详细点吗?谢谢。

----------------------------------------------

To zqrqq(zqrain(结帖是一种美德)) :

谢谢,我测试一下看看
zqrqq 2007-06-29
  • 打赏
  • 举报
回复
原理:不用bufferreader,自己写读入的代码,但是这样可能会消耗更多的memery

InputStream in = new InputStreamReader(u.openStream());
StringBuffer cb = new StringBuffer();
byte[] bs = new byte[1024 * 16];//如果内存不是问题,可以根据文件大小,继续增加这个buffer的大小
long t2 = System.currentTimeMillis();
while(true) {
int count = in.read(bs);
if(count == -1) {
break;
} else {
cb.append(new String(bs, 0, count));
}
}
in.close();
long t3 = System.currentTimeMillis();
System.out.println("保存代码用时:"+String.valueOf(t3-t2));
ChDw 2007-06-29
  • 打赏
  • 举报
回复
System.out.println("读取网页内容耗时:"+String.valueOf(t2-t1));

你的理解是有错的,这里u.openStream()只是打开链接,并非已经读出网页内容

81,094

社区成员

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

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