Lire l'URL à la chaîne en quelques lignes de code java


J'essaie de trouver l'équivalent de Java à Groovy:

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

Je veux lire le contenu d'une URL dans une chaîne. Je ne veux pas polluer mon code avec des flux et des boucles tamponnés pour une tâche aussi simple. J'ai examiné HttpClient d'apache mais je ne vois pas non plus d'implémentation d'une ou deux lignes.

Author: Eric Leschinski, 2010-12-01

9 answers

Maintenant que quelque temps s'est écoulé depuis que la réponse originale a été acceptée, il y a une meilleure approche:

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

Si vous voulez une implémentation légèrement plus complète, qui n'est pas une seule ligne, faites ceci:

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() : "";
    }
}
 109
Author: ccleve, 2018-02-27 16:22:12

Cette réponse fait référence à une ancienne version de Java. Vous voudrez peut-être regarder la réponse de ccleve.


Voici la façon traditionnelle de le faire:

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

Comme @ extraneon l'a suggéré, ioutils vous permet de le faire d'une manière très éloquente qui est toujours dans l'esprit Java:

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

 try {
   System.out.println( IOUtils.toString( in ) );
 } finally {
   IOUtils.closeQuietly(in);
 }
 92
Author: Joseph Weissman, 2017-12-08 14:58:50

, Ou simplement utiliser IOUtils.toString(URL url), ou la variante qui accepte aussi un paramètre d'encodage.

 65
Author: steve, 2016-09-12 12:54:52

Maintenant que plus de temps s'est écoulé, voici un moyen de le faire en 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"));
}
 16
Author: Jeanne Boyarsky, 2016-06-23 10:00:34

Exemple supplémentaire utilisant la goyave:

URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);
 9
Author: takacsot, 2014-05-06 05:57:20

Il existe un moyen encore meilleur à partir de Java 9:

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

Comme l'exemple groovy original, cela suppose que le contenu est encodé en UTF-8. (Si vous avez besoin de quelque chose de plus intelligent que cela, vous devez créer une URLConnection et l'utiliser pour comprendre l'encodage.)

 6
Author: Sean Reilly, 2017-12-30 13:40:57

Si vous avez le flux d'entrée (voir la réponse de Joe), considérez également ioutils.toString (inputstream ).

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

 4
Author: extraneon, 2010-12-01 20:36:31

Ce qui suit fonctionne avec Java 7/8, URL sécurisées, et montre comment ajouter un cookie à votre demande ainsi. Remarque c'est surtout une copie directe de cette autre grande réponse sur cette page, mais a ajouté le témoin exemple, et des précisions qu'il fonctionne avec secure url ainsi ;-)

Si vous devez vous connecter à un serveur avec un certificat non valide ou un certificat auto-signé, cela génère des erreurs de sécurité sauf si vous importez le certificat. Si vous avez besoin de cette fonctionnalité, vous pourrait considérer l'approche détaillée dans cette réponse à cette question liée à sur StackOverflow.

Exemple

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

Sorties

<!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
Author: Brad Parks, 2017-05-23 12:18:04

Voici la belle réponse de Jeanne, mais enveloppée dans une fonction bien rangée pour les muppets comme moi:

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;
}
 1
Author: Dave, 2018-09-07 15:37:44