目前,我正在研究可用于读取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
改为使用。此外,你可能想利用IOUtils
从Apache的百科全书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);
网站的内容由网页构成。通常,当用户访问一个网站时,实际打开的是网站服务器上某个文件目录下的某个网页文件。 当我们在浏览器地址栏里 输入一串URL时, 浏览器就通过查找这串URL对应的“地址”, 找到网页文件,并在浏览器中渲染呈现。 URL的结构说明 URL的结构构成: 传输协议 + 服务器hostname(有时需要端口号) + path(文件路径) + 查询参数 例如,http://zh.wiki
问题内容: 我正在入侵用于捕获SMTP电子邮件并处理邮件数据的Node程序。该库将邮件数据作为流提供,但我不知道如何将其转换为字符串。 我目前正在使用将其写入stdout ,但是正如我所说,我需要将流数据替换为字符串,一旦流结束,就可以使用它。 如何将所有数据从Node.js流收集到字符串中? 问题答案: 关键是使用Readable Stream 的和事件。听这些事件: 收到事件后,将新的数据块添
问题内容: 我想编写一个Go程序,以使用将从数据库表中的行转储到csv文件中。 Go提供了出色的sql和csv api,但是希望根据其类型在“填充”字段中使用字符串数组和方法。因为我之前不知道表,所以我不知道有多少列以及它们的类型。 这是我在Go中的第一个程序,所以我有点挣扎。 如何最好地将实例中的列读入-,这是“正确”的方式吗? 谢谢! 更新 我还在为参数苦苦挣扎。这是我的代码,目前我使用的不是
问题内容: 我需要在我的站点中显示另一个外部站点的内容。通常标签可以做到这一点。但我的要求不是全部内容,而只是该网站的一部分。例如该网站的布局有3个部分,,,。我的意思是我只想显示一部分。我该怎么做? 我试过了,但是没有用。 问题答案: 这是由于ajax跨域安全性限制,一种技巧是从服务器设置代理脚本,该脚本从不同的站点(域)下载内容,并将该代理用作javascript中的参考。 示例:(proxy
我试图在使用Http入站网关创建的服务上编写一个集成测试,它给我的错误是“java.nio.charset.unsupportedcharsetexception:cesu-8”。知道为什么吗?此服务正常工作。我们有一个一天多次使用它的套餐应用程序。我想有一个集成测试,可以调用它以及。下面是我的测试:
问题内容: 我读了这篇文章,但我没有关注。我已经看到了,但还没有看到将转换为使用的正确示例。 要检索的内容为,使用推荐的还是有一个更可取的方法? 我正在考虑这个示例,并扩展并利用Decorator在运行时增加功能。是否有兴趣将其作为使用?的更好解决方案? 问题答案: A 可以读取任何内容,最后得到a 。 但是,使用a 更简单: 对于 产量,字节总数。 评论的答案:使用ByteArrayOutput