在几行java代码中读取url to string

Pom*_*ius 146 java url http

我试图找到Java相当于Groovy的:

String content = "http://www.google.com".toURL().getText();
Run Code Online (Sandbox Code Playgroud)

我想将URL中的内容读入字符串.我不想用缓冲的流和循环来污染我的代码以完成这么简单的任务.我查看了apache的HttpClient,但我也没有看到一行或两行实现.

ccl*_*eve 122

既然原来的答案被接受了一段时间,那么有一个更好的方法:

String out = new Scanner(new URL("http://www.google.com").openStream(), "UTF-8").useDelimiter("\\A").next();
Run Code Online (Sandbox Code Playgroud)

如果您想要一个稍微全面的实现,这不是一行,请执行以下操作:

public static String readStringFromURL(String requestURL) throws IOException
{
    try (Scanner scanner = new Scanner(new URL(requestURL).openStream(),
            StandardCharsets.UTF_8.toString()))
    {
        scanner.useDelimiter("\\A");
        return scanner.hasNext() ? scanner.next() : "";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是不要忘记你需要稍后调用`Scanner #close()`. (14认同)
  • 整洁,但如果网页没有返回内容("")则失败.你需要`String result = scanner.hasNext()?scanner.next():"";`来处理它. (7认同)
  • \\ A做什么? (5认同)
  • @ccleve在此处添加导入会很有用,Java中有多个扫描器和URL (3认同)
  • 正则表达式\\ A匹配输入的开头.这告诉Scanner将整个流标记化,从开始到下一个开始(不合逻辑). (2认同)
  • @ccleve你可以更新链接"这解释了\\ A:"? (2认同)

Jos*_*man 95

这个答案指的是Java的旧版本.你可能想看一下ccleve的答案.


以下是执行此操作的传统方法:

import java.net.*;
import java.io.*;

public class URLConnectionReader {
    public static String getText(String url) throws Exception {
        URL website = new URL(url);
        URLConnection connection = website.openConnection();
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                    connection.getInputStream()));

        StringBuilder response = new StringBuilder();
        String inputLine;

        while ((inputLine = in.readLine()) != null) 
            response.append(inputLine);

        in.close();

        return response.toString();
    }

    public static void main(String[] args) throws Exception {
        String content = URLConnectionReader.getText(args[0]);
        System.out.println(content);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如@extraneon所建议的那样,ioutils允许你以一种非常雄辩的方式做到这一点,这仍然是Java精神:

 InputStream in = new URL( "http://jakarta.apache.org" ).openStream();

 try {
   System.out.println( IOUtils.toString( in ) );
 } finally {
   IOUtils.closeQuietly(in);
 }
Run Code Online (Sandbox Code Playgroud)

  • 该字符串将不包含任何行终止字符(因为使用了删除它们的BufferReader.readLine()),因此它不完全是URL的内容. (7认同)
  • 您可以将main方法重命名为,例如`getText`,将URL字符串作为参数传递并具有一个单行:`String content = URLConnectionReader.getText("http://www.yahoo.com/");` (5认同)

小智 71

或者只是使用IOUtils.toString(URL url),或者也接受编码参数的变体.

  • +1谢谢,这完美无缺.一行代码并关闭流!请注意,不推荐使用`IOUtils.toString(URL)`.`IOUtils.toString(URL url,String encoding)`是首选. (12认同)
  • 一行代码,以及现在运行时中的数十兆字节的无关类文件.包括一个巨大的库,以避免编写一些(实际上,一行)代码并不是一个伟大的决定. (3认同)
  • @JeffreyBlattman 如果您只在应用程序中使用它一次,这可能不是一个明智的决定,但如果您更频繁地使用它以及来自 commons-io 包的其他东西,那么它可能又是一个明智的决定。它还取决于您正在编写的应用程序。如果它是移动或桌面 ap,您可能会三思而后行,以增加额外的库来增加内存占用。如果它是在 64 GB RAM 机器上运行的服务器应用程序,那么只需忽略这 10 MB - 现在内存很便宜,基本内存占用是总内存的 1.5% 还是 2% 并不重要 (2认同)

Jea*_*sky 21

现在已经过了更多时间,这是在Java 8中实现它的一种方法:

URLConnection conn = url.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
    pageText = reader.lines().collect(Collectors.joining("\n"));
}
Run Code Online (Sandbox Code Playgroud)


Sea*_*lly 12

从Java 9开始,还有一种更好的方法:

URL u = new URL("http://www.example.com/");
try (InputStream in = u.openStream()) {
    return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}
Run Code Online (Sandbox Code Playgroud)

与原始的groovy示例一样,这假定内容是UTF-8编码的.(如果你需要比这更聪明的东西,你需要创建一个URLConnection并用它来计算编码.)


tak*_*sot 8

使用Guava的其他示例:

URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

  • Guava 文档说 [link](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/Resources.html):请注意,即使这些方法使用 {@link URL}参数,它们通常不适用于 HTTP 或其他非类路径资源 (2认同)

Zhe*_*lov 6

Java 11+:

URI uri = URI.create("http://www.google.com");
HttpRequest request = HttpRequest.newBuilder(uri).build();
String content = HttpClient.newHttpClient().send(request, BodyHandlers.ofString()).body();
Run Code Online (Sandbox Code Playgroud)