如何从Java中的BufferedReader对象中提取整个内容的最佳方法是什么?

san*_*lto 6 java performance bufferedreader

我试图通过URLConnection获取整个WebPage.

最有效的方法是什么?

我已经这样做了:

URL url = new URL("http://www.google.com/");
URLConnection connection;
connection = url.openConnection();
InputStream in = connection.getInputStream();        
BufferedReader bf = new BufferedReader(new InputStreamReader(in));
StringBuffer html = new StringBuffer();
String line = bf.readLine();
while(line!=null){
    html.append(line);
    line = bf.readLine();
}
bf.close();
Run Code Online (Sandbox Code Playgroud)

html包含整个HTML页面.

duf*_*ymo 8

我认为这最好的方法.页面的大小是固定的("它就是它"),因此你无法改善内存.也许你可以在拥有它们后压缩它们,但它们在那种形式下并不是很有用.我想最终你会想要将HTML解析为DOM树.

您为了并行化读取而做的任何事情都会使解决方案过于复杂化.

我建议使用默认大小为2048或4096的StringBuilder.

你为什么认为你发布的代码不够用?你听起来像是因为过早优化而感到内疚.

用你拥有的东西跑,晚上睡觉.


mik*_*era 2

您的方法看起来相当不错,但是您可以通过避免为每行创建中间 String 对象来提高效率。

执行此操作的方法是直接读入临时 char[] 缓冲区。

这是执行此操作的代码的稍微修改版本(为了清楚起见,减去所有错误检查、异常处理等):

        URL url = new URL("http://www.google.com/");
        URLConnection connection;
        connection = url.openConnection();
        InputStream in = connection.getInputStream();        
        BufferedReader bf = new BufferedReader(new InputStreamReader(in));
        StringBuffer html = new StringBuffer();

        char[] charBuffer = new char[4096];
        int count=0;

        do {
            count=bf.read(charBuffer, 0, 4096);
            if (count>=0) html.append(charBuffer,0,count);
        } while (count>0);
        bf.close();
Run Code Online (Sandbox Code Playgroud)

为了获得更高的性能,如果要频繁调用此代码,您当然可以做一些额外的事情,例如预分配字符数组和 StringBuffer。