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 :

Opération sur fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut Opération sur fichier
    Bonsoir,

    je possède un fichier disons f1.txt sur lequel je dois modifier en fonction de son contenu.

    Pour cela je récris un second fichier f1bis.txt qui contiendra les données modifiés.

    Cette étape marche correctement, il s'agit bêtement de lire f1 et écrire f1bis.


    Le problème étant qu'une fois le traitement terminé, j'aimerais supprimer f1 qui sera l'ancien fichier. Mais je veux également que f1bis prenne le nom f1 pour que tout reste fonctionnel lors des prochaines exécutions.

    J'ai donc vu qu'il y avait deux méthode s'appliquant à un fichier.

    delete pour supprimer.

    Et puis une autre dont je n'ai plus le nom en tête qui devrait renommé le fichier en utilisant un second fichier paramètre.

    J'ai donc testé ces deux fonctions mais mes deux fichiers restent inchangés et j'avoue ne pas voir pourquoi.


    Merci pour les informations que vous pourriez avoir.

  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,


    Sans code c'est difficile à dire, mais il est probable que les fichiers ne soient pas correctement fermés...


    a++

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Je poste le code demain si j'ai pas trouvé la solution d'ici là.

    Mais il me semble bien avoir tout fermé, à la fois le BufferedWriter, le fichier et le filewritter.

    Je revérifierais quand même demain.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Salut, effectivement, j'avais oublié un close. Maintenant la suppression fonctionne.

    En revanche je n'arrive toujours pas à renommer; confirmé par l'affichage.

    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
    65
    66
    67
    68
    69
    public void changeRatio(String city,String ratio){
    		ArrayList<String> l=this.listCity();
    		File f=this.getFile();
    		if(f.getName().equals(fileRatio)){
    			//read file
    			if(!l.contains(city)){
    				//if the city doesn't exist, we just add it to the file
    				this.addInfo(city, ratio);
    			}else{
    				BufferedReader lecteurAvecBuffer = null;
    				String line; 
    				try{
    					lecteurAvecBuffer = new BufferedReader(new FileReader(f.getPath()));
    				}	
    		    		catch(FileNotFoundException exc){
    		    			//should never happen
    		    			System.out.println("Fichier non trouvé\n");
    		    		}
    				try{
    					//create file
    					String path=workspace+"\\villeRatio2.txt";
                                            //create new file
    					BufferedWriter writer = new BufferedWriter(new FileWriter(new File(path)));
    					//open writting mode the file
    					FileWriter fw= new FileWriter(path,true);
    					while ((line = lecteurAvecBuffer.readLine()) != null){
    						//Read the file line by line while city ! found or !EOF
    						
    						String[] info=line.split(" ");
    						String cityRead=info[0];
    						String ratioRead=info[1];
    						String infos="";
    						if(cityRead.equals(city)){
    							//change ratio and write it
    							System.out.println("Le ratio a bien été modifié\n");
    							infos=cityRead+" "+ratio+"\r\n";
    						}else{
    							infos=cityRead+" "+ratioRead+"\r\n";
    						}
    						fw.write(infos);
    					
    					}
    					lecteurAvecBuffer.close();
    					fw.close();
    					writer.close();
    					//rename new file
    					File fnew=new File(path);
    					if(fnew.renameTo(this.getFile())){
    						System.out.println("Fichier renommé\n");
    					}else{
    						System.out.println("Echec renommage\n");
    					}
    					if(this.getFile().delete()){
    						System.out.println("Fichier supprimé OK\n");
    					}else{
    						System.out.println("Echec suppression\n");
    					}
    				}catch (IOException e){
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    					System.out.println("Echec de la lecture");
    				}
    			}
    		}else{
    			System.out.println("Vous ne pouvez pas utiliser cette méthode sur un objet identifié par un autre chemin que celui menant à "
    					+fileRatio);
    		}
    	}

    EDIT:

    J'ai trouvé une solution de dépannage, en utilisant ma classe lançant des commandes batch, je peux modifier le fichier avec le cmd et ren.

    Mais j'aimerais bien comprendre pourquoi renameTo ne marche pas...

  5. #5
    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
    C'est parce que tu supprimes ton fichier après le renommage.
    Pour que rename() fonctionne il faut que le fichier de destination n'existe pas.

    • Pourquoi traiter à part le FileNotFoundException ? surtout si c'est pour continuer le traitement (ce qui provoquera un NullPointerException).
    • Pourquoi ouvrir deux fois le fichier en écriture ???
    • Enfin il est préférable d'utiliser des try/finally pour la fermeture, et un bloc catch unique pour le traitement.



    Bref quelque chose qui ressemble à 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
    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
    		try {
    			final BufferedReader lecteurAvecBuffer = new BufferedReader(new FileReader(f.getPath()));
    			try {
    				String path = workspace + "\\villeRatio2.txt";
    				final FileWriter fw = new FileWriter(path, true);
    				try {
    					String line;
    					while ((line = lecteurAvecBuffer.readLine()) != null) {
    						String[] info = line.split(" ");
    						String cityRead = info[0];
    						String ratioRead = info[1];
    						String infos = "";
    						if (cityRead.equals(city)) {
    							// change ratio and write it
    							System.out.println("Le ratio a bien été modifié\n");
    							infos = cityRead + " " + ratio + "\r\n";
    						} else {
    							infos = cityRead + " " + ratioRead + "\r\n";
    						}
    						fw.write(infos);
    					}
     
     
     
    					if (this.getFile().delete()) {
    						System.out.println("Fichier supprimé OK\n");
    					} else {
    						System.out.println("Echec suppression\n");
    					}
     
    					File fnew = new File(path);
    					if (fnew.renameTo(this.getFile())) {
    						System.out.println("Fichier renommé\n");
    					} else {
    						System.out.println("Echec renommage\n");
    					}
     
     
     
    				} finally {
    					fw.close();
    				}
     
    			} finally {
    				lecteurAvecBuffer.close();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    			System.out.println("Echec de la lecture/ecriture");
    		}
    A noter qu'il faudrait spécifier l'encodage des fichiers, et utiliser un fichier temporaire via createTempFile() pour éviter de potentiels conflits...




    Maintenant si tu tournes sous Java 7 tu peux utiliser le try-with ressource pour fermer automatiquement les fichiers, et surtout la nouvelle API Path bien plus élaboré pour la gestion des fichiers.
    (elle a l'avantage de générer des exceptions claires en cas d'erreur) :

    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
    			try {
    				final Path source = f.toPath();
    				final Path dest = Files.createTempFile(source.getParent(), "villeRatio", ".tmp");
    				final Charset cs = StandardCharsets.ISO_8859_1;
     
    				try (BufferedReader lecteurAvecBuffer = Files.newBufferedReader(source, cs);
    						BufferedWriter fw = Files.newBufferedWriter(dest, cs)) {
    					String line;
    					while ((line = lecteurAvecBuffer.readLine()) != null) {
    						String[] info = line.split(" ");
    						String cityRead = info[0];
    						String ratioRead = info[1];
    						String infos = "";
    						if (cityRead.equals(city)) {
    							// change ratio and write it
    							System.out.println("Le ratio a bien été modifié\n");
    							infos = cityRead + " " + ratio + "\r\n";
    						} else {
    							infos = cityRead + " " + ratioRead + "\r\n";
    						}
    						fw.write(infos);
    					}
    				} // les fichiers sont fermées automatiquement
     
    				Files.move(dest, source,
    						StandardCopyOption.REPLACE_EXISTING,
    						StandardCopyOption.ATOMIC_MOVE);
     
    			} catch (IOException e) {
    				e.printStackTrace();
    				System.out.println("Echec de la lecture/ecriture");
    			}

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Pour Java7, je ne suis pas certain, le prog est voué à windows mais la version de java pourrait changer en fonction des serveurs.

    En fait je me servais de writer simplement pour créer le fichier. C'est en effet un peu maladroit et j'aurais probablement pu/dû utilisé la méthode que tu as évoqué.


    Merci !

    Pour l'histoire du fileNotFound traité à part, c'est tout simplement parce que si le file n'est pas là où il doit être je ne rentre même pas dans la condition du dessus, et donc si je passe ce if là il est impossible d'avoir cette exception, sauf si quelques choses m'échappe =)
    Bref, si c'était moi, je ne l'aurais même pas mis, mais java m'oblige à le mettre donc =)

  7. #7
    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
    Citation Envoyé par Amnael Voir le message
    Pour l'histoire du fileNotFound traité à part, c'est tout simplement parce que si le file n'est pas là où il doit être je ne rentre même pas dans la condition du dessus, et donc si je passe ce if là il est impossible d'avoir cette exception, sauf si quelques choses m'échappe =)
    Bah raison de plus de la mettre dans le même try/catch que le reste du traitement, et de ne pas lui faire un catch spécifique...


    Citation Envoyé par Amnael Voir le message
    Bref, si c'était moi, je ne l'aurais même pas mis, mais java m'oblige à le mettre donc =)
    C'est un des gros défaut de Java : forcer le traitement des exceptions...


    a++

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

Discussions similaires

  1. [VBA-E] Opérations sur fichiers txt
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/04/2007, 19h19
  2. [VBA-E] Opération sur fichiers xls dans un même répertoir
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/03/2007, 11h58
  3. [VBA-E] Encore opération sur fichier txt
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/03/2007, 12h43
  4. [VBA-E] Parcourir un repertoir et opérations sur fichiers xls
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 08/03/2007, 16h48
  5. opérations sur fichier
    Par mmx dans le forum C
    Réponses: 8
    Dernier message: 07/01/2006, 14h13

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