Читайте url для строки в нескольких строках кода Java
Я пытаюсь найти эквивалент Java Groovy:
String content = "http://www.google.com".toURL().getText();
Я хочу прочитать контент из URL-адреса в строку. Я не хочу загрязнять свой код буферизованными потоками и циклами для такой простой задачи. Я посмотрел на apache HttpClient, но я также не вижу ни одной или двух строк.
Ответы
Ответ 1
Теперь, когда прошло некоторое время с тех пор, как был принят первоначальный ответ, есть лучший подход:
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() : "";
}
}
Ответ 2
Этот ответ относится к более старой версии 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);
}
Ответ 3
Либо просто используйте Apache Commons IOUtils.toString(URL url)
, либо вариант, который также принимает параметр кодировки.
Ответ 4
Теперь, когда прошло больше времени, вот способ сделать это в 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"));
}
Ответ 5
Дополнительный пример с использованием Guava:
URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);
Ответ 6
Есть еще лучший способ, как в Java 9:
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 и использовать его для выяснения кодировки.)
Ответ 7
Если у вас есть входной поток (см. ответ Джо), также рассмотрите ioutils.toString(входной поток).
http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toString(java.io.InputStream)
Ответ 8
Следующее работает с Java 7/8, защищенными URL-адресами и показывает, как добавить файл cookie к вашему запросу. Обратите внимание, что это в основном прямая копия этого другого отличного ответа на этой странице, но добавил пример файла cookie и пояснения в том, что он также работает с защищенными URL-адресами;-)
Если вам нужно подключиться к серверу с недопустимым сертификатом или самоподписанным сертификатом, это приведет к ошибкам безопасности, если вы не импортируете сертификат. Если вам нужна эта функциональность, вы можете рассмотреть подход, подробно описанный в этом ответе, к этому связанному вопросу о 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);
}
}
Ответ 9
Вот Жанна прекрасный ответ, но завернутый в аккуратную функцию для кукол вроде меня:
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;
}
Ответ 10
URL на строку в чистом Java
Пример вызова
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/info/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);
}
}
Pros
-
Это чистая ява
-
Его можно легко улучшить, добавив различные заголовки (вместо передачи нулевого объекта, как в примере выше), аутентификацию и т.д.
-
Обработка протокольных коммутаторов поддерживается