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();
}
}
}
}
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();
}
}
}
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().
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl