将网站内容读入字符串

Mac*_*rko 16 java io url networking

目前我正在开发一个类,可以用来读取url指定的网站内容.我刚开始我的冒险经历java.iojava.net,所以我需要咨询我的设计.

用法:

TextURL url = new TextURL(urlString);
String contents = url.read();
Run Code Online (Sandbox Code Playgroud)

我的代码:

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!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:这是实现我想要的好方法吗?还有更好的解决方案吗?

我特别不喜欢,sb.append(new String(dataBuffer, ZERO, bytesRead));但我无法以不同的方式表达它.每次迭代都创建一个新的String是否合适?我想不.

还有其他弱点吗?

提前致谢!

Whi*_*g34 19

考虑URLConnection改用.此外,你可能想利用IOUtilsApache的百科全书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);
Run Code Online (Sandbox Code Playgroud)

如果你不想使用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);
Run Code Online (Sandbox Code Playgroud)


yve*_*lem 6

我强烈建议使用专用库,如HtmlParser:

Parser parser = new Parser (url);
NodeList list = parser.parse (null);
System.out.println (list.toHtml ());
Run Code Online (Sandbox Code Playgroud)

编写自己的html解析器是如此松散的时间.这是它的maven依赖.查看其JavaDoc以深入了解其功能.

看下面的样本应该是令人信服的:

Parser parser = new Parser(url);
NodeList movies = parser.extractAllNodesThatMatch(
    new AndFilter(new TagNameFilter("div"),
    new HasAttributeFilter("class", "movie")));
Run Code Online (Sandbox Code Playgroud)