Подтвердить что ты не робот

Читайте url для строки в нескольких строках кода Java

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

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

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

4b9b3361

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

Ответ 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

  • Это чистая ява

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

  • Обработка протокольных коммутаторов поддерживается