当前位置: 首页 > 面试题库 >

将网站内容读入字符串

国跃
2023-03-14
问题内容

目前,我正在研究可用于读取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改为使用。此外,你可能想利用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