用几行 Java 代码读取 url 到 string

我试图找到 Java 与 Groovy 的等价物:

String content = "http://www.google.com".toURL().getText();

我想把内容从 URL 读入字符串。我不想为这样一个简单的任务使用缓冲流和循环来污染我的代码。我查看了 apache 的 HttpClient,但也没有看到一两行的实现。

227281 次浏览

这个答案指的是 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);
}
}

正如@extraneon 所建议的,Ioutils允许您以一种非常有说服力的方式完成这项工作,这种方式仍然保留着 Java 的精神:

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


try {
System.out.println( IOUtils.toString( in ) );
} finally {
IOUtils.closeQuietly(in);
}

如果您有输入流(参见 Joe 的答案) ,也可以考虑 ioutils.toString (inputstream)。

Http://commons.apache.org/io/api-1.4/org/apache/commons/io/ioutils.html#tostring (java.io. inputStream )

现在距离最初的答案被接受已经过去了一段时间,有一个更好的方法:

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

如果您想要一个稍微完整一点的实现,而不是一行,那么可以这样做:

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() : "";
}
}

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

使用番石榴的附加例子:

URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);

现在时间已经过去了,这里有一个在 Java8中实现它的方法:

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

以下内容适用于 Java7/8,保护 url,并显示了如何向请求中添加 cookie。注意,这主要是 这一页上的另一个伟大的答案的一个直接副本,但是添加了 cookie 示例,并澄清了它也适用于安全 URL; -)

如果需要连接到具有无效证书或自签名证书的服务器,则将引发安全性错误,除非导入证书。如果你需要这个功能,你可以 考虑一下这个答案中详细描述的方法到这个 关于堆栈溢出的相关问题。

例子

String result = getUrlAsString("https://www.google.com");
System.out.println(result);

输出

<!doctype html><html itemscope="" .... etc

密码

import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;


public static String getUrlAsString(String url)
{
try
{
URL urlObj = new URL(url);
URLConnection con = urlObj.openConnection();


con.setDoOutput(true); // we want the response
con.setRequestProperty("Cookie", "myCookie=test123");
con.connect();


BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));


StringBuilder response = new StringBuilder();
String inputLine;


String newLine = System.getProperty("line.separator");
while ((inputLine = in.readLine()) != null)
{
response.append(inputLine + newLine);
}


in.close();


return response.toString();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}

对于 Java9,还有一种更好的方法:

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

与最初的 groovy 示例一样,这里假设内容是 UTF-8编码的。(如果需要更聪明的方法,则需要创建一个 URLConnection 并使用它来确定编码。)

以下是珍妮可爱的回答,但对于像我这样的木偶来说,它包含了一个简洁的功能:

private static String getUrl(String aUrl) throws MalformedURLException, IOException
{
String urlData = "";
URL urlObj = new URL(aUrl);
URLConnection conn = urlObj.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)))
{
urlData = reader.lines().collect(Collectors.joining("\n"));
}
return urlData;
}

纯 Java 中的 URL 到字符串

示例调用 从 http get call 获取有效负载

 String str = getStringFromUrl("YourUrl");

实施

您可以在 如何将 URL 读取到 InputStream上使用这个答案中描述的方法,并在 如何将 InputStream 读取到 String上将其与这个答案结合起来。

结果会是这样的

public String getStringFromUrl(URL url) throws IOException {
return inputStreamToString(urlToInputStream(url,null));
}


public String inputStreamToString(InputStream inputStream) throws IOException {
try(ByteArrayOutputStream result = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}


return result.toString(UTF_8);
}
}


private InputStream urlToInputStream(URL url, Map<String, String> args) {
HttpURLConnection con = null;
InputStream inputStream = null;
try {
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(15000);
con.setReadTimeout(15000);
if (args != null) {
for (Entry<String, String> e : args.entrySet()) {
con.setRequestProperty(e.getKey(), e.getValue());
}
}
con.connect();
int responseCode = con.getResponseCode();
/* By default the connection will follow redirects. The following
* block is only entered if the implementation of HttpURLConnection
* does not perform the redirect. The exact behavior depends to
* the actual implementation (e.g. sun.net).
* !!! Attention: This block allows the connection to
* switch protocols (e.g. HTTP to HTTPS), which is <b>not</b>
* default behavior. See: https://stackoverflow.com/questions/1884230
* for more info!!!
*/
if (responseCode < 400 && responseCode > 299) {
String redirectUrl = con.getHeaderField("Location");
try {
URL newUrl = new URL(redirectUrl);
return urlToInputStream(newUrl, args);
} catch (MalformedURLException e) {
URL newUrl = new URL(url.getProtocol() + "://" + url.getHost() + redirectUrl);
return urlToInputStream(newUrl, args);
}
}
/*!!!!!*/
        

inputStream = con.getInputStream();
return inputStream;
} catch (Exception e) {
throw new RuntimeException(e);
}
}

优点

  • 这是纯咖啡

  • 通过添加不同的头作为映射(而不是像上面的例子那样传递空对象)、身份验证等,可以很容易地增强它。

  • 支持协议交换机的处理

Java11 + :

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