Читайте URL в строку в несколько строк кода Java - PullRequest
136 голосов
/ 01 декабря 2010

Я пытаюсь найти эквивалент Java в Groovy:

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

Я хочу прочитать содержимое из URL в строку.Я не хочу загрязнять свой код буферизованными потоками и циклами для такой простой задачи.Я посмотрел в HttpClient Apache, но я также не вижу одно-двухстрочной реализации.

Ответы [ 10 ]

117 голосов
/ 29 ноября 2012

Теперь, когда прошло некоторое время с тех пор, как был принят первоначальный ответ, есть лучший подход:

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() : "";
    }
}
94 голосов
/ 01 декабря 2010

Этот ответ относится к более старой версии 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);
 }
70 голосов
/ 05 мая 2013

Или просто используйте Apache Commons IOUtils.toString(URL url), или вариант, который также принимает параметр кодирования.

20 голосов
/ 12 октября 2015

Теперь, когда прошло больше времени, вот способ сделать это в 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"));
}
8 голосов
/ 07 декабря 2017

В 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 и использовать его для выяснения кодировки.)

8 голосов
/ 06 мая 2014

Дополнительный пример использования гуавы:

URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);
4 голосов
/ 01 декабря 2010

Если у вас есть входной поток (см. Ответ Джо), также рассмотрите ioutils.toString (inputtream).

http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toString(java.io.InputStream)

3 голосов
/ 11 августа 2016

Следующее работает с 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);
    }
}
2 голосов
/ 07 сентября 2018

Вот прекрасный ответ Жанны, но в виде аккуратной функции для кукол вроде меня:

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;
}
0 голосов
/ 01 февраля 2019

URL-адрес строки в чистом Java

Пример вызова

 String str = getStringFromUrl("YourUrl");

Реализация

Вы можете использовать методописано в этом ответе на Как прочитать URL-адрес для InputStream и объединить его с этим ответом на Как прочитать InputStream в строку .

Результатом будет что-токак

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);
    }
}

Плюсы

  • Это чистая Java

  • Может быть легко улучшенопутем добавления различных заголовков (вместо передачи нулевого объекта, как в примере выше), аутентификации и т. д.

  • Поддерживается обработка переключателей протокола

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...