Partage
  • Partager sur Facebook
  • Partager sur Twitter

manipulations dans les fichiers

Sujet résolu
8 décembre 2021 à 19:57:34

bonjour

en java,je crée un fichier TXT, j ecrit dedans,et ensuite,dans le meme code je veux lire le contenu de mon fichier;mon cursueur etant a la fin du fichier ,je ne lit rien;quelqu un peut il m indiquer ou trouver sur le web des cours java pour la manipulation du curseur dans un fichier,pour pouvoir le depalcer au debut , a la fin ou a n importe quelle position.j ai cherché sans rien trouver a ce sujet ;merci de votre aide;voici mon code,juste pour info

package lesfichiersbases;
//Packages à importer afin d'utiliser les objets

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Java write file using FileWriter write method

 *
 */
public class principal {

	public static void main(String[] args) {
		FileWriter fileWriter = null;
		try {
			fileWriter = new FileWriter("C:\\Users\\Desktop\\eclipse\\prog eclipse\\lesfichiersbases\\src\\lesfichiersbases\\file.txt");
			//crée un fichier
			fileWriter.write(65);//rempli le fichier avec les caracteres ascii 65=A 66=B 67=C
			fileWriter.write(66);
			fileWriter.write(67);
			fileWriter.write("Hello world\n");//pour ecrire helloworld avec saut de ligne
			fileWriter.write('a');
			FileReader fr = new FileReader("C:\\UserDesktop\\eclipse\\prog eclipse\\lesfichiersbases\\src\\lesfichiersbases\\file.txt");
			int str = fr.read();//read renvoi un int du caractere lu en ascii,si il n y a plus rien a lire il renvoi-1
			System.out.println(str);
			// affiche le code ASCII du caract`ere lu
			System.out.println((char)str);
			// affiche le caract`ere lu
			while (str != -1) {
				System.out.println((char)str);
				// affiche tous les caract`eres lus
				str = fr.read();}
			while ((str = fr.read()) != -1)
				System.out.println(str);
				// affiche tous les caract`eres lus
			fr.close();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {//gestion des exceptions si le fichier n est pas crée ca referme le flux ou met l erreur printstack
				if (fileWriter != null) {
					fileWriter.flush();
					fileWriter.close();	
				
					
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}



  • Partager sur Facebook
  • Partager sur Twitter
9 décembre 2021 à 20:02:20

Tu peux utiliser la classe FileChannel pour lire un fichier et te positionner dedans.
  • Partager sur Facebook
  • Partager sur Twitter
24 janvier 2022 à 10:48:28

bonjour

j arrive donc a me deplacer dans un fichier avec le code ci dessous;par contre ,je ne comprend pas tout.quand j utilise "raf.writeBytes("bonjour a tous")",je retouve bien "bonjour a tous dans mon fichier et je lit "bonjour a tous" en retourdans ma console;pour moi ,je pensais ecrire des bytes et non un string;si j utilse "raf.writeChars("c est un essai");",j ecrit une ligne enstring mais chaque lettre est separée d un espace,et a la lecture dans la console d eclipse on retouve cet espace,qui est d ailleurs compté avec seek;si quelqu un peut m expliquer tout cela se serait sympa,merci

import java.io.*;

public class principal1 {
   public static void main(String[] args) {
   
      try {//effacer le fichier avant l essai!!!!!!!!
         // cree un fichier test avec random acces file
         RandomAccessFile raf = new RandomAccessFile("C:\\test.txt", "rw");

         // ecrit dans le fichier 
         raf.writeBytes("bonjour a tous");//avec writeBytes il n y a rien d inutile,alors qu avec writeChars on a des espaces
         System.out.println("position curseur :" + raf.getFilePointer());//affiche la position actuelle du curseur
         raf.writeBytes("encore du texte 5 4 3 2 1");
         // met le pointeur a 0
         raf.seek(0);

         // lit ce qui est ecrit (avant c etait readUTF)
         System.out.println("" + raf.readLine());

         // met le pointeur a la position 5
         raf.seek(5);

         // ecrit dans le fichier a partir du curseur avant c etait writeUTf
         raf.writeChars("c est un essai");

         // met le pointeur a 0
         raf.seek(0);
        // lit ce qui est ecrit (avant c etait readUTF);voir plus haut pour les espaces superflus
         System.out.println("" + raf.readLine());
         
      } catch (IOException ex) {
         ex.printStackTrace();
      }
   }


}
  • Partager sur Facebook
  • Partager sur Twitter
25 janvier 2022 à 2:40:23

Hello,

par nature RandomAccessFile n'est pas adapté aux fichiers texte. Bien sûr on peut toujours faire avec puisqu'il peut gérer n'importe quoi, mais comme il n'est pas adapté, les méthodes proposées ne le sont pas non plus. RandomAccessFile est fait pour les fichiers formatés en binaire opaque.

writeChars() écrit une séquence de chars, littéralement. En fait il se contente de faire writeChar() pour tous les caractères de la String, et rien de plus. Contrairement à writeUTF() ça ne peut pas être utilisé seul parce qu'alors rien n'indique où s'arrêtent les chars.

Un char est codé sur 16 bits, donc ça prend deux octets, d'où sur du texte normal, le fait que les caractères texte soient séparés par des octets nuls.

writeBytes() écrit une séquence de bytes, littéralement. Il se contente de faire writeByte() pour chaque caractère de la String. Comme writeChar() elle ne peut donc pas être utilisée seule. Bien sûr, les caractères étant en principe codés sur 16 bits ça ne rentre pas dans un byte, mais il se contente pour chaque de ne garder que les 8 bits inférieurs et d'enlever les 8 bits supérieurs, qui sont purement et simplement perdus. En gros c'est une méthode pour fournir des octets ASCII simplement, mais peu adaptée à du vrai texte.

Pour écrire vraiment du texte avec RandomAccessFile, il faudrait obtenir les bytes du texte, avec :

byte[] bytes = "Le texte\n".getBytes(StandardCharsets.UTF_8);

et d'écrire ces bytes. Bien sûr ce n'est pas adapté. Il vaut mieux un simple Writer, ou juste Files.writeLines().

  • Partager sur Facebook
  • Partager sur Twitter