将网站内容读入字符串

目前我正在开发一个可用于读取url指定的网站内容的类。 我刚刚开始使用java.iojava.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中的 IOUtilsIOUtils字符串读取。 例如:

 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快速添加它,它还允许操作页面内容并查找特定节点。