Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[debutant] lire dans un RandomAccessFile

3 réponses
Avatar
julien
Bonjour
J'arrive à écrire des enregistrements de taille fixe dans un
RandomAccessFile, mais pas à les lire.

Ma méthode de lecture ressemble à cela:

String[] getRecord(String index) throws IOException {

if (openRead()) {

try {
String current = "";
int count = 0;

do {
stream.seek(SIZE * 2 * count);

current += stream.readChar();
System.out.println("->" + current);

count++;

}
while (count < 10);

close();
return null;
}
catch (EOFException eofException) {
close();
return null;
}

}
else {
return null;
}
}

Mon fichier commence par "un", mais le programme m'affiche
"->?" pour la première lettre lue.

J'ai essayé différentes méthodes (lire un tableau de bytes, ...), je
n'arrive pas à afficher la première lettre "u" du fichier.

Merci
Julien

3 réponses

Avatar
JScoobyCed
julien wrote:

Bonjour
J'arrive à écrire des enregistrements de taille fixe dans un
RandomAccessFile, mais pas à les lire.


current += stream.readChar();


il faut faire plutot:
current += (char) stream.read();

Maintenant, au lieu d'un String current, il serait pas mal d'utiliser un
StringBuffer. Et encore mieux, de lire un tableau de byte et d'en faire
une chaine de caractere au besoin.

--
JScoobyCed
What about a JScooby snack Shaggy ? ... Shaggy ?!

Avatar
julien
JScoobyCed wrote:
il faut faire plutot:
current += (char) stream.read();

Maintenant, au lieu d'un String current, il serait pas mal d'utiliser un
StringBuffer. Et encore mieux, de lire un tableau de byte et d'en faire
une chaine de caractere au besoin.

Merci


J'avais commencé par essayer de lire un tableau de bytes, mais j'avais
quelqus dificultés. Je vais réessayer à nouveau.

Pzr contre, il y a encore quelque chose aue je ne comprends pas dans mon
code (le clode est donné plus bas): j'ai écris 1 record de taille totale
600. Dans mon code, je vais un seek(0, seek(600), seek(1200), ... Mais
jamais je ne quitte la boucle sur un EOFException! J'ai édité le fichier
à la main, sa taille est bien de 600.

Voici le code:
String[] getRecord(String index) throws IOException {

if (openRead()) {
String values[] = new String[size.length];

try {
String current = "";
int count = 0;

do {
stream.seek(SIZE * 2 * count);

char value = 'a';
do {
value = (char) stream.read();
current += value;
System.out.println("->" + value);
}
while ((byte) value > 0);
System.out.println("->" + current);

current = "";


count++;
System.out.println("" + count);

}
while (count < 10);

System.out.println("--->" + current);

close();
return null;
}
catch (EOFException eofException) {
close();
return null;
}

}
else {
return null;
}


}

Merci
Julien

Avatar
JScoobyCed
julien wrote:


J'avais commencé par essayer de lire un tableau de bytes, mais j'avais
quelqus dificultés. Je vais réessayer à nouveau.

Pzr contre, il y a encore quelque chose aue je ne comprends pas dans mon
code (le clode est donné plus bas): j'ai écris 1 record de taille totale
600. Dans mon code, je vais un seek(0, seek(600), seek(1200), ... Mais
jamais je ne quitte la boucle sur un EOFException! J'ai édité le fichier
à la main, sa taille est bien de 600.


Si tu regardes la javadoc:
seek: cette methode peut aller plus loin que la fin du fichier. Cela est
util pour l'ecriture (laisser un 'blanc' de x octets)
read: retourne la valeur lut, ou '-1' si la fin du fichier est atteinte

Aucune de ces methode ne jette un EOFException


--
JScoobyCed
What about a JScooby snack Shaggy ? ... Shaggy ?!