Lire l'url vers la chaîne de caractères 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 en chaîne. Je ne veux pas polluer mon code avec des flux et des boucles tamponnées pour une tâche aussi simple. J'ai regardé dans HttpClient d'apache mais je ne vois pas non plus d'implémentation sur une ou deux lignes.

128
demandé sur Eric Leschinski 2010-12-01 23:22:20

9 réponses

maintenant Qu'un certain 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 un peu 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
répondu ccleve 2018-02-27 16:22:12

cette réponse se réfère à 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 encore dans L'esprit de Java:

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

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

ou utilisez IOUtils.toString(URL url) , ou la variante qui accepte également un paramètre d'encodage.

65
répondu steve 2016-09-12 12:54:52

maintenant que plus de temps a passé, voici une façon 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
répondu 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
répondu takacsot 2014-05-06 05:57:20

il y a une façon encore meilleure que 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 original, cela suppose que le contenu est encodé UTF-8. (Si vous avez besoin de quelque chose de plus intelligent que cela, vous devez créer une connexion URL et l'utiliser pour comprendre l'encodage.)

6
répondu 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
répondu extraneon 2010-12-01 20:36:31

fonctionne avec Java 7/8, sécurisé url, et montre comment ajouter un cookie à votre demande. 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 ;-)

si vous devez vous connecter à un serveur avec un certificat non valide ou un certificat auto-signé, cela lancera des erreurs de sécurité à moins que vous importiez le certificat. Si vous avez besoin de cette fonctionnalité, vous pouvez considérer 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);

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
répondu Brad Parks 2017-05-23 12:18:04

Voici la réponse charmante de Jeanne, mais enveloppée dans une fonction ordonné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
répondu Dave 2018-09-07 15:37:44