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

Entrée/Sortie Java Discussion :

InputStream reprend où il en était avant Exception


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 26
    Points : 31
    Points
    31
    Par défaut InputStream reprend où il en était avant Exception
    Bonjour,

    Je cherche à télécharger des fichiers CSV assez long depuis une requête HTTP.
    Tout marche bien la plupart du temps. De manière sporadique (un fichier sur 15 environ) j'obtiens une exception "java.net.SocketException: Connection reset".
    Je pense (mais je peux me tromper) que cette exception est "normale" et provient d'une erreur ou d'un temps de réponse trop long coté serveur. (Le serveur est un petit dataLogger et il faut compter plusieurs secondes pour récupérer un fichier d'une centaine de KO).
    J'ai donc décidé d'attraper l'exception et de relancer le téléchargement après une seconde d'attente.

    Ceci fonctionne, SAUF QUE : La deuxième fois que je tente de télécharger le fichier, je me retrouve uniquement avec la partie que je n'ai pas pu récupérer la première fois.

    Pour résumé :
    1. Je tente de récupérer le fichier X
    2. Je récupère 1000 lignes
    3. Une "connection reset" survient
    4. Je ré-entre dans la méthode une seconde plus tard
    5. Je récupère les lignes de 1001 à 3000



    Voici un bout de code de ce que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private List<String> readLines(String fileName, InetAddress addr) throws IOException, IOReadLogException {
    		HttpURLConnection con = this.getUrlGenerator().openConnnection(fileName, addr); // Génnère un nouveau HttpURLConnection à chaque appel
    		con.connect();
    	    try (InputStream inputStream = con.getInputStream();
    	         InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    	         BufferedReader buffer = new BufferedReader(inputStreamReader)) {
    	         return buffer.lines().collect(Collectors.toList());
    	    }catch(UncheckedIOException e) {
    	    	throw new IOException(e);
    	    }
     
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private List<String> read() {
    	while(true) {
    		try {
    			return this.readLines(fileName, addr);
    		}catch (IOException e) {
    			Thread.sleep(1000);
    		}
    	}
    }
    La méthode read n'est pas celle réellement utilisée mais c'est pour l'exemple.

    Je ne comprend pas pourquoi - quand je rentre pour la deuxième fois dans la méthode readLines - le téléchargement reprend là où il s'était arrêté la première fois et de quelle manière je peux m'assurer d'avoir tout récupéré.
    Après je peux toujours sauvegarder le premier résultat en bdd, le récupérer lors de la deuxième tentative... mais c'est contourner le problème et je n'ai pas de garantie qu'il n'y ai pas eu de doublon ou de données manquantes.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Si tu accèdes vraiment à la même URL, alors cela signifie que ce comportement dépend entièrement de ton serveur.
    Impossible de t'aider plus sans avoir plus d'info sur ce dernier.

    Sinon : tu n'as rien pour identifier une ligne (ID incrémenté ou autre) qui te permettrait de détecter la perte de données ?

    a++

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    avec code présenté, tu lis bien depuis le début de l'inputStream. Si tes données sont incohérente, c'est que le serveur envoie du caca.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    Merci pour vos réponses, malheureusement je n'ai absolument pas la main sur le serveur.

    Je vais devoir sauvegarder la progression du téléchargement du fichier ligne par ligne et implémenter une méthode qui vérifie l'intégrité et la cohérence des données

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Il vaudrait mieux octet par octet que lire par ligne, du coup.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [Débutant] Frame.GoBack() : retrouver la page comme elle était avant de la quitter
    Par StringBuilder dans le forum Développement Mobile
    Réponses: 2
    Dernier message: 23/11/2016, 14h42
  2. Réponses: 6
    Dernier message: 11/06/2010, 03h57
  3. [Nostalgie] C'était mieux avant ?
    Par davcha dans le forum La taverne du Club : Humour et divers
    Réponses: 65
    Dernier message: 04/09/2006, 14h34

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