目前我正在开发一个可用于读取网址指定网站内容的类。我刚刚开始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是否合适?我想没有。
还有其他弱点吗?
提前致谢!
答案 0 :(得分:18)
请考虑使用URLConnection
。此外,您可能希望利用IOUtils
中的Apache Commons IO来简化字符串阅读。例如:
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);
答案 1 :(得分:6)
我强烈建议您使用专用库,例如HtmlParser:
Parser parser = new Parser (url);
NodeList list = parser.parse (null);
System.out.println (list.toHtml ());
编写自己的html解析器是如此松散的时间。这是its maven dependency。请查看its JavaDoc以了解其功能。
观察以下样本应该令人信服:
Parser parser = new Parser(url);
NodeList movies = parser.extractAllNodesThatMatch(
new AndFilter(new TagNameFilter("div"),
new HasAttributeFilter("class", "movie")));
答案 2 :(得分:2)
除非这是为了学习而想要编码的某种练习......我不会重新发明轮子,我会使用HttpURLConnection。
HttpURLConnection
提供了良好的封装机制来处理HTTP协议。例如,您的代码无法使用HTTP重定向,HttpURLConnection
会为您解决此问题。
答案 3 :(得分:2)
您可以将InputStream
打包到InputStreamReader
,并可以使用it's read()
method直接读取字符数据(请注意,应在创建时指定编码Reader
,但找出任意网址的编码并非易事。然后只需使用您刚刚阅读的char[]
(以及正确的偏移量和长度)调用sb.append()
。
答案 4 :(得分:0)
嘿请使用这些代码行,它会对你有帮助..
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
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());
答案 5 :(得分:0)
我知道这是一个老问题,但我相信其他人也会发现它。
如果你不介意额外的依赖,这是一个非常简单的方法
Jsoup.connect("http://example.com/").get().toString()
您需要一个Jsoup库,但您可以使用maven / gradle快速添加它,它还允许操作页面内容并查找特定节点。