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

Langage Java Discussion :

Lire un fichier qui est modifié par un autre programme pendant la lecture.


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut Lire un fichier qui est modifié par un autre programme pendant la lecture.
    Bonjour à tous,

    je suis un étudiant francais en stage en allemagne et j'ai un petit souci.
    En fait je dois écrire un programme qui consiste à lire des données en temps réel dans un fichier csv. Mon problème c'est que pendant la lecture de ce fichier de nouvelles lignes seront ajoutées via un programme extérieur. Donc en gros, je cherche à lire un fichier csv qui est lui-même modifié par un autre programme tout en laissant ouvert le csv dans mon code java...

    Pour le moment j'ai fait ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    File file = new File(path);
    BufferedReader bufRdr = new BufferedReader(new FileReader(file));
     
    while(line = bufRdr.readLine() != null){
     
      "je récupère mes données ligne par ligne"
     
    }

    Le problème c'est que je ne suis pas sur que ca marchera lorsque mon programme tiers ajoutera des lignes à mon fichier csv. En effet, j'ai dans un premier temps lancé ce code java tout en essayant de modifier manuellement des donnés dans le csv avec excel et ca plante avant la fin avec le message suivant:
    "Stale NFS file handle"

    Donc ca me laisse penser que lorsque que mon programme extérieur modifiera mon csv ca fera tout planter, qu'en pensez-vous? (je n'ai pas encore accès à ce programme tiers pour l'instant)

    Qui plus est, lorsque ma boucle while a parcourue tout le csv ligne par ligne, je ne voudrais pas sortir de la boucle mais plutôt attendre jusqu'à ce qu'une nouvelle ligne soit ajouté. Cependant, je n'ai pas trouvé de fonction du genre
    If (bufRdr.nextLineIsEmpty()) then wait jusqua ce que ce ne soit plus vide.

    Auriez-vous une idée intéressante? J'ai pensé reparcourir le fichier ligne par ligne chaque seconde (une ligne est ajouté chaque seconde) mais certains csv font genre 400mo donc sera beaucoup trop long en terme de calcul, j'ai vraiment besoin de pouvoir le lire dynamiquement sans le fermer.

    Merci pour toute idée intéressante ou commentaire,

    Antoine

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il faudrait utiliser une boucle infini (ou bien avoir une condition de sortie), et traiter le retour de readLine() :
    • Si c'est différent de null on a une nouvelle ligne qu'on peut traiter
    • Sinon il faut attendre un peu avant de retenter de lire la ligne (pour éviter de surcharger le CPU pour rien).


    Bref quelque chose comme cela :
    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
    		File file = new File("c:\\tmp\\file.txt");
    		BufferedReader reader = new BufferedReader(new FileReader(file));
    		try {
    			String line;
    			while (true) {
    				line = reader.readLine();
    				if (line!=null) {
    					System.out.println(line);
    				} else {
    					Thread.sleep(250);
    				}
    			}
    		} finally {
    			reader.close();
    		}

    a++

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut
    Merci de ta réponse. Ok je pense que je vais faire comme ca, comme je sais qu'une ligne est forcément ajouté toute les secondes ca devrait aller si je le fait patienter un petit peu.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut pb pour accéder au fichier csv
    Salut,

    j'ai un autre problème maintenant, en fait le fichier auquel je souhaiterai accéder est sur un une autre machine qui est reliée à la première grâce à un réseau SAMBA. Du coup jai essayé depuis linux en java d'y accéder par ce chemin d'accès:

    new File("smb://machine/sousdossier/fichier.csv");

    Mais ca ne fonctionne pas , j'ai aussi essayé //machine/sousdossier/fichier.csv mais à chaque fois j'obtiens une exception du type FileNotFoundException.

    Quelqu'un aurai-t-il une idée du chemin à indiquer? Si cela est possible...

    Merci et bonne journée

  5. #5
    Modérateur

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

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

    La classe File ne concerne que les fichiers situés dans le système de fichier natif de l'OS. Ce n'est pas le cas des URL, et sous linux la notation //machine n'existe pas.

    Il faudrait que le partage samba de cette machine soit monté directement sur le système de fichiers de ton linux.
    Ou alors utiliser la bibliothèque JCIFS, qui implémente un client SMB en Java, au lieu de File.

    Dans les deux cas, je ne sais pas trop si SMB gère bien les fichiers lus par untel et écrits par untel en même temps.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut
    Salut merci pour ta réponse,
    oui j'avais vu l'API JCIFS mais je ne voulais pas trop l''utiliser car ca semblait compliqué. En fin de compte je crois que c'est un des seuls moyens. Du coup pour lire mon fichier ligne par ligne j'ai utiliser le bout de code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SmbFile smb             = new SmbFile("smb://machine/sousdossier/fichier.csv");
    InputStream file           = smb.getInputStream();
    IntputStreamREader is = new IntputStreamReader(file);
    BufferedReader bufRdr = new BufferedReader(is);
    String line = null;
     
    while(line = bufRdr.readLine() != null){
     
       Alors je peux travailler ligne par ligne sur mon fichier.
     
    }

Discussions similaires

  1. [VB.NET] Comment supprimer un fichier qui est utilisé ?
    Par Toon94 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/06/2010, 12h59
  2. Réponses: 5
    Dernier message: 12/03/2010, 11h03
  3. Telecharger fichier dans JSP généré par un autre programme
    Par ilellouc dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 14/08/2009, 10h30
  4. lire un fichier qui est dans un plugin
    Par *alexandre* dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 13/02/2008, 10h08
  5. Réponses: 2
    Dernier message: 16/10/2003, 17h17

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