我试图找到与Groovy等效的Java:
String content = "http://www.google.com".toURL().getText();
我想将URL中的内容读取为字符串。我不想用如此简单的任务用缓冲的流和循环来污染我的代码。我查看了apache的HttpClient,但也没有看到一两行的实现。
我试图找到与Groovy等效的Java:
String content = "http://www.google.com".toURL().getText();
我想将URL中的内容读取为字符串。我不想用如此简单的任务用缓冲的流和循环来污染我的代码。我查看了apache的HttpClient,但也没有看到一两行的实现。
Answers:
自从最初的答案被接受以来,已经过去了一段时间,有一种更好的方法:
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() : "";
}
}
Scanner#close()
稍后致电。
String result = scanner.hasNext() ? scanner.next() : "";
处理。
此答案是指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);
}
getText
,将URL字符串作为参数传递,并采用单行代码:String content = URLConnectionReader.getText("http://www.yahoo.com/");
或仅使用Apache Commons IOUtils.toString(URL url)
或也接受编码参数的变体。
IOUtils.toString(URL)
已弃用。IOUtils.toString(URL url, String encoding)
是首选。
IOUtils.toString(url, (Charset) null)
达到相似的结果。
现在已经过去了更多的时间,这是在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"));
}
http://www.worldcat.org/webservices/catalog/search/opensearch
Web服务上使用此示例时,我仅获得xml的前两行。
从Java 9开始,还有一种更好的方法:
URL u = new URL("http://www.example.com/");
try (InputStream in = u.openStream()) {
return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}
像原始的常规示例一样,这假定内容是UTF-8编码的。(如果您需要比这更聪明的东西,则需要创建一个URLConnection并使用它来找出编码。)
getClass().getResourceAsStream(...)
打开jar中的文本文件。
使用番石榴的其他示例:
URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);
如果您有输入流(请参阅Joe的答案),请考虑ioutils.toString(inputstream)。
http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toString(java.io.InputStream)
以下内容适用于Java 7/8(安全网址),并说明了如何向您的请求中添加Cookie。请注意,这主要是此页面上其他出色答案的直接副本,但添加了cookie示例,并进行了澄清,因为它也适用于安全网址;-)
如果需要使用无效证书或自签名证书连接到服务器,除非您导入证书,否则这将引发安全错误。如果您需要此功能,则可以考虑在StackOverflow上此相关问题的答案中详细介绍的方法。
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);
}
}
这是珍妮的漂亮答案,但包裹着像我这样的木偶的整洁功能:
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;
}
呼叫范例
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: /programming/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);
}
}
优点
它是纯Java
通过添加不同的标头(而不是像上面的示例那样传递空对象),身份验证等,可以轻松地增强它。
支持协议开关的处理