【发布时间】:2010-11-14 00:13:27
【问题描述】:
我有以下 Java 代码来获取给定 URL 处 HTML 页面的全部内容。这可以以更有效的方式完成吗?欢迎任何改进。
public static String getHTML(final String url) throws IOException {
if (url == null || url.length() == 0) {
throw new IllegalArgumentException("url cannot be null or empty");
}
final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
final BufferedReader buf = new BufferedReader(new InputStreamReader(conn.getInputStream()));
final StringBuilder page = new StringBuilder();
final String lineEnd = System.getProperty("line.separator");
String line;
try {
while (true) {
line = buf.readLine();
if (line == null) {
break;
}
page.append(line).append(lineEnd);
}
} finally {
buf.close();
}
return page.toString();
}
我不禁觉得行阅读不是最佳的。我知道我可能掩盖了由openConnection 调用引起的MalformedURLException,我可以接受。
我的函数还具有使 HTML 字符串具有当前系统的正确行终止符的副作用。这不是要求。
我意识到网络 IO 可能会使读取 HTML 所需的时间相形见绌,但我仍然想知道这是最优的。
附带说明:如果StringBuilder 有一个用于打开InputStream 的构造函数,它会简单地获取InputStream 的所有内容并将其读入StringBuilder,那就太棒了。
【问题讨论】:
-
您可能想尝试 java.util.Scanner 作为旁注的解决方案。查看java-tips.org/java-se-tips/java.util/… 并查找使用java.net.URL 读取java.net 的示例。
-
在我的应用程序的另一部分,我使用正则表达式从行中提取一些值,
Scanner可能会派上用场。但是,在这里我不禁觉得与其他更直接的解决方案相比,它会产生一些开销。 -
请参阅stackoverflow.com/questions/4185665/…,了解如何使用 Guava 的 CharStreams.toString 方法将 InputStream 转换为字符串,考虑字符集。
标签: java string optimization inputstream micro-optimization