web-dev-qa-db-fra.com

Lire l'URL d'une chaîne dans quelques lignes de code Java

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

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

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

132
Pomponius

Maintenant que la réponse initiale a été acceptée avec un certain temps, il existe une meilleure approche: 

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

Si vous souhaitez une mise en œuvre légèrement plus complète, qui ne correspond pas à une seule ligne, procédez comme suit:

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

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


Voici la manière traditionnelle de faire ceci:

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 et 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
Joseph Weissman

Ou utilisez simplement IOUtils.toString(URL url) , ou la variante qui accepte également un paramètre de codage.

68
steve

Maintenant que plus de temps a passé, voici une façon de le faire dans 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"));
}
17
Jeanne Boyarsky

Exemple supplémentaire d'utilisation de goyave:

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

Il existe une méthode encore meilleure à 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 dans l'exemple groovy d'origine, cela suppose que le contenu est codé en UTF-8. (Si vous avez besoin de quelque chose de plus intelligent, vous devez créer une connexion URLConnection et l'utiliser pour déterminer le codage.)

6
Sean Reilly

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

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

4
extraneon

Ce qui suit fonctionne avec Java 7/8, les URL sécurisées et montre également comment ajouter un cookie à votre demande. Notez que ceci est principalement une copie directe de cette autre excellente réponse sur cette page , mais a ajouté l’exemple de cookie et une précision en ce sens que cela fonctionne également avec les URL sécurisées ;-) 

Si vous devez vous connecter à un serveur avec un certificat non valide ou un certificat auto-signé, cela générera des erreurs de sécurité, sauf si vous importez le certificat. Si vous avez besoin de cette fonctionnalité, vous pouvez envisager l’approche détaillée dans cette réponse à cette question relative à StackOverflow.

Exemple

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

les 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
Brad Parks

Voici la belle réponse de Jeanne, mais enveloppée dans une fonction de rangement pour des 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;
}
2
Dave

URL vers String en Java pur

Exemple d'appel

 String str = getStringFromUrl("YourUrl");

La mise en oeuvre

Vous pouvez utiliser la méthode décrite dans cette réponse, sur Comment lire une URL vers un InputStream et la combiner avec cette réponse sur Comment lire InputStream en String .

Le résultat sera quelque chose comme

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