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页面.
我认为这是最好的方法.页面的大小是固定的("它就是它"),因此你无法改善内存.也许你可以在拥有它们后压缩它们,但它们在那种形式下并不是很有用.我想最终你会想要将HTML解析为DOM树.
您为了并行化读取而做的任何事情都会使解决方案过于复杂化.
我建议使用默认大小为2048或4096的StringBuilder.
你为什么认为你发布的代码不够用?你听起来像是因为过早优化而感到内疚.
用你拥有的东西跑,晚上睡觉.
您的方法看起来相当不错,但是您可以通过避免为每行创建中间 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。