将网站内容读入字符串
目前我正在开发一个可用于读取url指定的网站内容的类。 我刚刚开始使用java.io
和java.net
冒险,所以我需要咨询我的设计。
用法:
TextURL url = new TextURL(urlString); String contents = url.read();
我的代码:
package pl.maciejziarko.util; import java.io.*; import java.net.*; public final class TextURL { private static final int BUFFER_SIZE = 1024 * 10; private static final int ZERO = 0; private final byte[] dataBuffer = new byte[BUFFER_SIZE]; private final URL urlObject; public TextURL(String urlString) throws MalformedURLException { this.urlObject = new URL(urlString); } public String read() { final StringBuilder sb = new StringBuilder(); try { final BufferedInputStream in = new BufferedInputStream(urlObject.openStream()); int bytesRead = ZERO; while ((bytesRead = in.read(dataBuffer, ZERO, BUFFER_SIZE)) >= ZERO) { sb.append(new String(dataBuffer, ZERO, bytesRead)); } } catch (UnknownHostException e) { return null; } catch (IOException e) { return null; } return sb.toString(); } //Usage: public static void main(String[] args) { try { TextURL url = new TextURL("http://www.flickr.com/explore/interesting/7days/"); String contents = url.read(); if (contents != null) System.out.println(contents); else System.out.println("ERROR!"); } catch (MalformedURLException e) { System.out.println("Check you the url!"); } } }
我的问题是:这是实现我想要的好方法吗? 还有更好的解决方案吗?
我特别不喜欢sb.append(new String(dataBuffer, ZERO, bytesRead));
但我无法以不同的方式表达它。 每次迭代都创建一个新的String是否合适? 我想不。
还有其他弱点吗?
提前致谢!
请考虑使用URLConnection
。 此外,您可能希望利用Apache Commons IO中的 IOUtils
来IOUtils
字符串读取。 例如:
URL url = new URL("http://www.example.com/"); URLConnection con = url.openConnection(); InputStream in = con.getInputStream(); String encoding = con.getContentEncoding(); // ** WRONG: should use "con.getContentType()" instead but it returns something like "text/html; charset=UTF-8" so this value must be parsed to extract the actual encoding encoding = encoding == null ? "UTF-8" : encoding; String body = IOUtils.toString(in, encoding); System.out.println(body);
如果您不想使用IOUtils
我可能会在以下内容上重写该行:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[8192]; int len = 0; while ((len = in.read(buf)) != -1) { baos.write(buf, 0, len); } String body = new String(baos.toByteArray(), encoding);
我强烈建议使用专用库,如HtmlParser :
Parser parser = new Parser (url); NodeList list = parser.parse (null); System.out.println (list.toHtml ());
编写自己的html解析器是如此松散的时间。 这是它的maven依赖 。 查看其JavaDoc以深入了解其function。
看下面的样本应该是令人信服的:
Parser parser = new Parser(url); NodeList movies = parser.extractAllNodesThatMatch( new AndFilter(new TagNameFilter("div"), new HasAttributeFilter("class", "movie")));
除非这是为了学习而想要编码的某种练习……我不会重新发明轮子,我会使用HttpURLConnection 。
HttpURLConnection
提供了良好的封装机制来处理HTTP协议。 例如,您的代码不适用于HTTP重定向, HttpURLConnection
会为您解决这个问题。
您可以将InputStream
包装在InputStream
中,并可以使用它的read()
方法直接读取字符数据(请注意,您应该在创建Reader
时指定编码,但找出任意URL的编码并非易事)。 然后简单地使用刚刚读取的char[]
调用sb.append()
(以及正确的偏移量和长度)。
嘿请使用这些代码行,它会帮助你..
JSP Page Hello World!
URL uri= new URL("Your url"); URLConnection ec = uri.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader( ec.getInputStream(), "UTF-8")); String inputLine; StringBuilder a = new StringBuilder(); while ((inputLine = in.readLine()) != null) a.append(inputLine); in.close(); out.println(a.toString());
我知道这是一个老问题,但我相信其他人也会发现它。
如果你不介意额外的依赖,这是一个非常简单的方法
Jsoup.connect("http://example.com/").get().toString()
您需要一个Jsoup库,但您可以使用maven / gradle快速添加它,它还允许操作页面内容并查找特定节点。