it-swarm.com.de

Lese URL in ein paar Zeilen Java-Code

Ich versuche, Javas Äquivalent zu Groovys zu finden:

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

Ich möchte Inhalte von einer URL in einen String einlesen. Ich möchte meinen Code nicht mit gepufferten Streams und Schleifen für solch eine einfache Aufgabe verschmutzen. Ich habe mir Apache's HttpClient angesehen, sehe aber auch keine ein oder zwei Zeilen.

132
Pomponius

Da einige Zeit vergangen ist, seit die ursprüngliche Antwort akzeptiert wurde, gibt es einen besseren Ansatz: 

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

Wenn Sie eine etwas umfassendere Implementierung wünschen, die keine einzelne Zeile ist, führen Sie folgende Schritte aus:

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

Diese Antwort bezieht sich auf eine ältere Version von Java. Vielleicht möchten Sie sich die Antwort von ccleve ansehen. 


Hier ist der traditionelle Weg, dies zu tun:

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

Wie @extraneon vorgeschlagen hat, erlaubt Ihnen ioutils , dies auf eine sehr eloquente Weise zu tun, die noch im Java-Geist ist:

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

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

Oder verwenden Sie einfach IOUtils.toString(URL url) oder die Variante, die auch einen Kodierungsparameter akzeptiert.

68
steve

Nachdem nun mehr Zeit vergangen ist, können Sie dies in Java 8 tun:

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

Zusätzliches Beispiel mit Guave:

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

Ab Java 9 gibt es einen noch besseren Weg:

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

Wie beim ursprünglichen Groovy-Beispiel wird davon ausgegangen, dass der Inhalt UTF-8-codiert ist. (Wenn Sie etwas Clevereres als das benötigen, müssen Sie eine URLConnection erstellen und diese verwenden, um die Kodierung herauszufinden.)

6
Sean Reilly

Wenn Sie den Eingabestrom haben (siehe Antwort von Joe), berücksichtigen Sie auch ioutils.toString (Eingabestrom).

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

4
extraneon

Das Folgende funktioniert mit Java 7/8, sicheren URLs, und zeigt, wie auch ein Cookie zu Ihrer Anfrage hinzugefügt wird. Beachten Sie, dass dies meistens eine direkte Kopie von diese andere großartige Antwort auf dieser Seite ist, das Cookie-Beispiel jedoch hinzugefügt wurde und die Klarstellung, dass es auch mit sicheren URLs funktioniert ;-) 

Wenn Sie eine Verbindung zu einem Server mit einem ungültigen Zertifikat oder einem selbstsignierten Zertifikat herstellen müssen, führt dies zu Sicherheitsfehlern, wenn Sie das Zertifikat nicht importieren. Wenn Sie diese Funktionalität benötigen, können Sie den in dieser Antwort beschriebenen Ansatz berücksichtigen zu diesem verwandte Frage zu StackOverflow.

Beispiel

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

ausgänge

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

Code

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);
    }
}
3
Brad Parks

Hier ist Jeannes schöne Antwort, aber für Muppets wie mich eine ordentliche Funktion:

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;
}
2
Dave

URL zu String in reinem Java

Beispielaufruf

 String str = getStringFromUrl("YourUrl");

Implementierung

Sie können die in dieser Antwort beschriebene Methode verwenden, unter So lesen Sie die URL für einen InputStream und kombinieren Sie sie mit dieser Antwort bei Wie liest man InputStream in String .

Das Ergebnis wird so etwas sein

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