IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Utiliser une HttpURLConnection pour un DataInputStream


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 43
    Par défaut Utiliser une HttpURLConnection pour un DataInputStream
    Salut a vous !

    Je souhaite écrire un script qui me connecte à un serveur (un répertoire d'un serveur) et récupérer son contenu pour cela j'ai commencé par faire un HttpURLConnection à l'adresse "http://monserveur/public/signals/" je relis la connection a un DataInputStream que je lis dans une boucle while avec un readByte que je re-écris aussitot dans un fichier File("mon repertoire") avec un DataOutputStream sur le File.

    Quand je lance le script ça me créer un fichier avec du code html qui lorsque je l'ouvre dans le navigateur m'affiche un liste des fichiers du répertoire (un peu comme ce genre de page que l'on peut trouver sur google qui recense les fichier d'un répertoire).
    J'aimerai que ça me créer un fichier de type directory avec les fichier à l'intérieur.

    voilà le code que j'ai écrit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package javaapplication6;
     
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    /**
     *
     * @author Alius
     */
    public class JavaApplication6 {
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            try {
     
                URL url = new URL("http://monserveur/public/");
                HttpURLConnection co = (HttpURLConnection) url.openConnection();
     
                co.setDoInput(true);
                co.setDoOutput(true);
                co.connect();
     
                DataInputStream input = new DataInputStream((co.getInputStream()));
     
                File dest = new File("dl");
                FileOutputStream f = new FileOutputStream(dest);
                DataOutputStream s = new DataOutputStream(f);
     
                Byte l;
                while((l = input.readByte()) != -1) {
     
                    s.writeByte(l);
                }
     
                input.close();
                s.close();
                f.close();
     
            }
            catch (MalformedURLException ex) {
     
                Logger.getLogger(JavaApplication6.class.getName()).log(Level.SEVERE, null, ex);
            }
            catch (IOException ex) {
     
                Logger.getLogger(JavaApplication6.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    Je ne met pas la vrai adresse de mon serveur pour des raison de confidentialité.

    Si quelqu'un peut m'aiguiller

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Eh bien,
    - Il faut commencer par parser le code HTML pour en extraire la liste des fichiers.
    Comment parser, ça dépend beaucoup à quoi il ressemble. Si vraiment ça ressemble à du HTML, JSoup devrait faire l'affaire. Si c'est plutôt du XML, JDom le fera très bien.

    À noter que DataInputStream et DataOutputStream ne sont pas du tout adaptés. Il vaudrait mieux garder le InputStream in = co.getInputStream() et le FileOutputStream, c'est ce que te demanderont des parseurs. D'un autre côté, des parseurs sont capables d'aller chercher directement une URL, sans utiliser HttpURLConnection.

    - Comment utiliser un parseur pour extraire la liste de fichiers, ah ben là, ça se fera pas tout seul. Il faut apprendre à se servir du parseur en faisant attentivement les tutoriels et en s'entraînant sur des exemples simples. Une fois qu'on maîtrise un peu, extraire une liste de données est un jeu d'enfant.

    - Une fois que tu as la liste des fichiers, il n'y a plus qu'à enregistrer tous les fichiers de cette liste. Pour ça, pour chaque fichier, il faut utiliser HttpURLConnection vers ce fichier, et l'enregistrer sur le disque comme tu as déjà réussi à le faire pour la liste.
    (Cela dit, je rigole pas, DataInputStream et DataOutputStream sont vraiment des mauvaises idées. Il vaut mieux utiliser Files.copy(inStream, outFile) qui s'occupera tout seul d'enregistrer une InputStream dans un fichier.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 43
    Par défaut
    Merci de ta réponse,

    j'ai déjà pensé a utiliser mon parseur et m'attaquer au fichier html mais je voulais d'abord être sur qu'il n'existait aucune autre solution me permettant de récupérer le contenue du répertoire sur le serveur avec java.


    Je vais essayer d'utiliser le HttpURLConnection et le File.copy(InputStream, File) qui à l'air plutôt puissant !
    Peux tu m'expliquer rapidement pourquoi dans ce cas la les DataInputStream et DataOutputStream ne sont pas une bonne idées ?, merci

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par AliusEquinox Voir le message
    j'ai déjà pensé a utiliser mon parseur et m'attaquer au fichier html
    Euuuuuh. Ton propre parseur ? Tu es sûr ? Bon... Je suppose que pour du HTML qui ne contient qu'une liste de fichiers, ce n'est pas si compliqué. Mais je pense que JSoup t'aurait beaucoup simplifié la vie.


    Citation Envoyé par AliusEquinox Voir le message
    mais je voulais d'abord être sur qu'il n'existait aucune autre solution me permettant de récupérer le contenue du répertoire sur le serveur avec java.
    Hélas les serveurs renvoient bien ce qu'ils veulent, on ne peut pas vraiment dire qu'il y ait un standard établi. Et pas de standard, pas de bibliothèque qui se charge de les lire. D'autant plus que si chaque programme doit refaire son propre code pour, ce n'est pas la mer à boire. Et surtout renvoyer un fichier HTML, c'est pour l'afficher dans un navigateur, pas pour qu'un programme puisse s'en servir. Si on veut qu'un programme puisse s'en servir, les APIs type REST sont là pour ça, il n'y a donc pas de raison de s'intéresser à un format qui n'est pas une API.

    Il doit sûrement exister des petites bibliothèques méconnues qui savent lire le format qui t'intéresse, le problème c'est d'en trouver une.

    Citation Envoyé par AliusEquinox Voir le message
    Peux tu m'expliquer rapidement pourquoi dans ce cas la les DataInputStream et DataOutputStream ne sont pas une bonne idées ?, merci
    Après réflexion c'est pas qu'ils soient vraiment mauvais, mais c'est qu'ils sont inutiles. Donc ça crée des objets pour rien et ça complique le code.
    Ça induit aussi en erreur les gens qui viendraient lire ton code et se demanderaient pourquoi tu as besoin des Data*Stream. T'en as pas besoin, ils perdent leur temps à se demander pourquoi et partent dans une mauvaise direction. C'est pour ça que j'appelle ça mauvais : si mes collègues faisaient ça, on perdrait du temps et de l'argent.

    Tu as besoin d'un InputStream et d'un OutputStream. L'InputStream tu l'as avec ta connexion, l'OutputStream tu le crées comme FileOutputStream. Ces objets sont déjà capables de lire et d'écrire tous les octets, pas besoin des Data*Stream. Et au passage, il vaut mieux lire et écrire des tableaux d'octets plutôt que un par un, ça va plus vite et ça stresse moins les IO. De toute façon, si tu utilises Files.copy(), c'est lui qui s'occupera de copier tous les octets, et il le fera bien.

    Au fait, ton code fait input.readByte() jusqu'à ce que ça renvoie -1. Euh. readByte() ne renvoie jamais -1 (*). Lorsque le stream est fini, si on l'appelle il déclenche une EOFException. Ce qui veut dire qu'il ne faut pas l'appeler quand le stream est fini, ce qui veut dire qu'il faut trouver un autre moyen de savoir si le code est fini. Les read() de InputStream, eux, renvoient bien -1. Ton code tombe toujours dans le catch IOException ce qui, en soi, devrait te dire qu'il y a un problème.

    (*) plus exactement, readByte() ne renvoie -1 que si on tombe sur un octet de valeur -1, chose peu probable dans un fichier HTML autogénéré. Mais très probable dans un fichier binaire quelconque. Ça ne marche pas, donc.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 43
    Par défaut
    Oui j'ai codé un parseur de balise en c++ il marche très bien. Mais après avoir jeté un oeil sur Jsoup je pense que je vais m'en servir directement dans mon code Java en utilisant le DOM.

    Pour les Data*Stream il est vrai que ils ne me serviront à rien ici du coup si j'ai bien compris, mais j'avouerai que j'ai encore du mal avec toutes ces classes java Stream, Reader, Input, Writter, Buffer ou pas Buffer, .... ça commence à rentrer mais je m'en sers trop peu souvent pour bien les connaitre. Un jour je relirai la spé Java

    Ah oui effectivement j'ai laissé une coquille, le -1 était là parce que j'utilisais un read au début.


    Je pense que j'ai à peu près toute les clés en main pour m'en sortir maintenant je vais m'u mettre, merci de ton aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/10/2006, 10h40
  2. Réponses: 1
    Dernier message: 17/05/2006, 09h19
  3. Utiliser une touche pour appeller une fonction
    Par Hide dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2005, 16h59
  4. [XSL] utiliser une variable pour nom d'élément
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 07/09/2004, 13h58
  5. Réponses: 36
    Dernier message: 13/05/2004, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo