163 votes

Lire une url en chaîne de caractères en quelques lignes de code java

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

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

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

7 votes

Pourquoi ne pas simplement créer une classe utilitaire qui encapsule tous ces flux et boucles tampons "pollués" ? Vous pourriez également utiliser cette classe pour gérer des choses comme la fermeture du socket avant la fin du flux et pour gérer les blocs d'E/S sur une connexion lente. Après tout, c'est de l'OO - encapsuler la fonctionnalité et la cacher de votre classe principale.

1 votes

Cela ne peut se faire en une ou deux lignes.

0 votes

Voir ZhekaKozlov réponse en 3 lignes, testée et sans dépendances externes

143voto

ccleve Points 3373

Maintenant qu'un certain temps s'est écoulé depuis que la réponse initiale a été acceptée, il existe une meilleure approche :

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

Si vous voulez une mise en œuvre un peu plus complète, qui ne soit pas une simple 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() : "";
    }
}

18 votes

N'oubliez pas que vous devez appeler Scanner#close() plus tard.

0 votes

Si le compilateur donne un avertissement de fuite, vous devez séparer l'instruction comme suit stackoverflow.com/questions/11463327/

2 votes

L'expression régulière \\A correspond au début de l'entrée. Ceci indique au Scanner de tokeniser le flux entier, du début au (illogique) prochain début.

96voto

Joseph Weissman Points 2778

Cette réponse fait référence à une ancienne version de Java. Vous pouvez consulter la réponse de ccleve.


Voici la manière traditionnelle de procéder :

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 l'a suggéré @extraneon, ioutils vous permet de le faire de manière très éloquente tout en restant dans l'esprit Java :

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

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

5 votes

Vous pourriez renommer la méthode principale en, disons getText passer une chaîne d'URL comme paramètre et avoir une ligne unique : String content = URLConnectionReader.getText("http://www.yahoo.com/");

7 votes

La chaîne ne contiendra aucun caractère de fin de ligne (en raison de l'utilisation de BufferReader.readLine() qui les supprime), elle ne sera donc pas exactement le contenu de l'URL.

0 votes

@Benoit Guedas alors comment conserver les sauts de ligne ?

84voto

steve Points 131

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

13 votes

+1 Merci, cela a parfaitement fonctionné. Une ligne de code et le flux est fermé ! Notez que IOUtils.toString(URL) est déprécié. IOUtils.toString(URL url, String encoding) est préférable.

1 votes

IOUtils.toString(url, (Charset) null) pour arriver à un résultat similaire.

4 votes

Une ligne de code, et des dizaines de mégaoctets de fichiers de classe superflus qui sont maintenant dans votre runtime. Inclure une bibliothèque gigantesque pour éviter d'écrire quelques (en fait, une) lignes de code n'est pas une bonne décision.

8voto

takacsot Points 535

Exemple supplémentaire utilisant Guava :

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

2 votes

Guava docs dit lien : Notez que même si ces méthodes utilisent des paramètres {@link URL}, elles ne sont généralement pas appropriées pour les ressources HTTP ou autres ressources non-classpath.

4voto

extraneon Points 13362

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

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

0 votes

Le lien est mort

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X