Tableau de String dans un fichier en Java

Fermé
Overdrive - 22 avril 2008 à 21:20
 Overdrive - 26 avril 2008 à 22:09
Bonjour, je voudrait savoir comment on pourrait enregistrer un tableau de string dans un fichierenJava. J'ai essayé dans tous les sens avec writeUTF de la classe Inputstream mais à chaque fois au moment d'écécuter mon programme, j'avais une exception disant qu'on ne pouvait pas traiter un String à partir d'un String[].
A voir également:

4 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
23 avril 2008 à 09:53
Bonjour,

Si tu me mets ton code d'enregistrement (ce que tu as déjà fait donc) je peux t'aider à résoudre ton problème.
En attendant, si ça peut t'aider, vu ton message d'erreur j'imagine que tu tente d'écrire directement ton tableau de String dans ton fichier alors que la méthode writeUtf ne prend en paramètre qu'une simple String.
Pour résoudre ton problème il faut que tu parcours ton tableau, et pour chaque entrée du tableau (c'est à dire chaque String), tu enregistre ton élément dans le fichier via writeUtf.
Attention toutefois, j'imagine que tu veux pouvoir ensuite relire ton fichier, donc pense à séparer tes chaines de caractères par un élément séparateur dans ton fichier (par exemple un ';').
0
En fait si j'ai parcouru le tableau mais c'est au moment de la lecture que ça marche pas. Meme en parcourant le tableau pour la lecture il y a une exception :

package definitions;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Menu {

public void menu() {
int choix;
String fichier,description;
Scanner sc = new Scanner(System.in);
Scanner scan = new Scanner(System.in);

System.out.println("______________________________");
System.out.println("1-Aide");
System.out.println("2-Nouveau fichier");
System.out.println("3-Test");
System.out.println("4-Quitter");
System.out.println("______________________________");
choix = sc.nextInt();

if(choix==1) {
aide();
menu();
}
else if (choix==2) {
System.out.print("Fichier : ");
fichier=scan.nextLine();
System.out.println("description : ");
description=scan.nextLine();

new_file(fichier,description);
menu();
}
else if (choix==3) {
System.out.print("Fichier : ");
fichier=scan.nextLine();
test(fichier);
menu();
}
}

public void aide() {
System.out.println("Pour faire un nouveau fichier de test, tapez 2, entrez le nom du fichier et la notion, puis enfin la definission. Pour stopper la boucle, tapez quit.");
System.out.println("Pour lancer un test, tapez 3 et entrez le nom du fichier correspondant. Des questions vous seront posees indefiniment jusqu'a ce que vous tapiez quit.");
System.out.println("Pour quitter le programme, tapez 4.");
}
public void new_file(String path, String description) {

Scanner entrée= new Scanner(System.in);
Scanner entnb = new Scanner(System.in);
String question[]= new String [100];
String reponse[]=new String [100];
int i=0, nbq=-1,yn=0;

try
{
// Suite d'instructions accédant au fichier et
// ne s'occupant pas de la gestion des erreurs

// Tentative d'ouvrir un fichier
OutputStream flotFichier = new FileOutputStream (path);
DataOutputStream flot = new DataOutputStream (flotFichier);

while(yn ==0) {

System.out.print("Voulez-vous quitter ?(1 pour oui et 0 pour non) : ");
yn = entnb.nextInt();

if(yn==0){
System.out.print("Entrer question : ");
question[i] = entrée.nextLine();
}
if(yn==0){
System.out.print("Entrer reponse : ");
reponse[i] = entrée.nextLine();
nbq++;
}

System.out.println("Enregistre dans t["+nbq+"]");
i++;

}
while(i!=10) {
System.out.print("Quelle chaine voulez vous lire ?");
i = entrée.nextInt();
System.out.println(question[i]); //les chaines sont bien enregistrées ds les variables
System.out.println(reponse[i]);
}
// Ecriture dans le fichier
flot.writeUTF(description);
for(i=0;question[i]!=null && reponse[i]!=null;i++) {
flot.writeUTF(question[i]);
flot.writeUTF(reponse[i]);
flot.writeInt(nbq);
}
flot.close();
}
catch (FileNotFoundException e)
{
// Exception déclenchée si le fichier n'existe pas
}
catch (IOException e){
System.out.println("Problème I/O");
// Exception déclenchée si un autre problème survient
// pendant l'accès au fichier
}

}

public void test(String path) {
Scanner entrée= new Scanner(System.in);
Scanner entnb = new Scanner(System.in);
String description,question,reponse;
int i,yn,nbq;

try
{
// Suite d'instructions accédant au fichier et
// ne s'occupant pas de la gestion des erreurs

// Tentative d'ouvrir un fichier
InputStream flotFichier = new FileInputStream (path);
DataInputStream flot = new DataInputStream (flotFichier);

description=flot.readUTF();
question=flot.readUTF();
reponse=flot.readUTF();
nbq=flot.readInt();

flot.close();
System.out.print("Tester ?(1 pour oui et 0 pour non) ");
yn=entnb.nextInt();
if(yn==1) {
System.out.println("Vous vous testeriez");
System.out.println(question[2]); //The type of the expression must be an array type but it resolved to String
System.out.println(nbq);
}
else{
System.out.println("Vous quiteriez");

}
}
catch (FileNotFoundException e)
{
// Exception déclenchée si le fichier n'existe pas
}
catch (IOException e){
System.out.println("Problème I/O");
// Exception déclenchée si un autre problème survient
// pendant l'accès au fichier
}
}



}
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
24 avril 2008 à 10:04
Qu'est ce que tu as exactement comme exception pour l'instant ?
Remplace ta gestion d'exception en ajoutant de quoi connaitre le vrai message d'erreur :
Remplace :
System.out.println("Problème I/O"); 

Par :
System.out.println("Problème I/O : "+e.getMessage); 


Pour le moment je ne vois pas trop ce qui n'irait pas, si tu peux me donner le libellé exact (en anglais) de l'exception que tu as ça m'aidera beaucoup.
0
Bon j'ai réécrit le code et je n'ai plus de pb pour enregistrer le tableau mais cette fois il y a un pb d'entrée sortie :


package definitions;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Menu {

public void menu() {
int choix;
String fichier,description;
Scanner sc = new Scanner(System.in);
Scanner scan = new Scanner(System.in);

System.out.println("______________________________");
System.out.println("1-Aide");
System.out.println("2-Nouveau fichier");
System.out.println("3-Test");
System.out.println("4-Quitter");
System.out.println("______________________________");
choix = sc.nextInt();

if(choix==1) {
aide();
menu();
}
else if (choix==2) {
System.out.print("Fichier : ");
fichier=scan.nextLine();
System.out.println("description : ");
description=scan.nextLine();

new_file(fichier,description);
menu();
}
else if (choix==3) {
System.out.print("Fichier : ");
fichier=scan.nextLine();
test(fichier);
menu();
}
}

public void aide() {
System.out.println("Pour faire un nouveau fichier de test, tapez 2, entrez le nom du fichier et la notion, puis enfin la definission. Pour stopper la boucle, tapez quit.");
System.out.println("Pour lancer un test, tapez 3 et entrez le nom du fichier correspondant. Des questions vous seront posees indefiniment jusqu'a ce que vous tapiez quit.");
System.out.println("Pour quitter le programme, tapez 4.");
}
public void new_file(String path, String description) {

Scanner entrée= new Scanner(System.in);
Scanner entnb = new Scanner(System.in);
String question[]= new String [100];
String reponse[]=new String [100];
int i=0,yn=0;

try
{
// Suite d'instructions accédant au fichier et
// ne s'occupant pas de la gestion des erreurs

// Tentative d'ouvrir un fichier
OutputStream flotFichier = new FileOutputStream (path);
DataOutputStream flot = new DataOutputStream (flotFichier);

while(yn ==0) {

System.out.print("Voulez-vous quitter ?(1 pour oui et 0 pour non) : ");
yn = entnb.nextInt();

if(yn==0){
System.out.print("Entrer question : ");
question[i] = entrée.nextLine();
}
if(yn==0){
System.out.print("Entrer reponse : ");
reponse[i] = entrée.nextLine();

}
i++;

}
while(i!=10) {
System.out.print("Quelle chaine voulez vous lire ?");
i = entrée.nextInt();
System.out.println(question[i]); //les chaines sont bien enregistrées ds les variables
System.out.println(reponse[i]);
}
// Ecriture dans le fichier
flot.writeUTF(description);
for(i=0;question[i]!=null && reponse[i]!=null;i++) {
flot.writeUTF(question[i]);
flot.writeUTF(reponse[i]);

}
flot.close();
}
catch (FileNotFoundException e)
{
// Exception déclenchée si le fichier n'existe pas
}
catch (IOException e){
System.out.println("Problème I/O");
// Exception déclenchée si un autre problème survient
// pendant l'accès au fichier
}

}

public void test(String path) {
Scanner entrée= new Scanner(System.in);
Scanner entnb = new Scanner(System.in);
String description;
String question[]= new String [100];
String reponse[]=new String [100];
int i,yn;

try
{
// Suite d'instructions accédant au fichier et
// ne s'occupant pas de la gestion des erreurs

// Tentative d'ouvrir un fichier
InputStream flotFichier = new FileInputStream (path);
DataInputStream flot = new DataInputStream (flotFichier);

description=flot.readUTF();
question[0]=flot.readUTF();
reponse[0]=flot.readUTF();
for(i=1;i<100;i++) {
if(question[i-1]!=null && reponse[i-1]!=null){
question[i]=flot.readUTF();
reponse[i]=flot.readUTF();
}

}

flot.close();
System.out.print("Tester ?(1 pour oui et 0 pour non) ");

yn=entnb.nextInt();
if(yn==1) {
System.out.println("______________________________");
System.out.println(description);
System.out.println("Vous vous testeriez");

System.out.println(question[0]);
System.out.println(reponse[0]);
System.out.println(question[1]);
System.out.println(reponse[1]);
System.out.println(question[2]);
System.out.println(reponse[2]);
System.out.println(question[3]);
System.out.println(reponse[3]);
}
else{
System.out.println("Vous quiteriez");

}
}
catch (FileNotFoundException e)
{
// Exception déclenchée si le fichier n'existe pas
}
catch (IOException e){
System.out.println("Problème I/O"+e.getMessage());
// Exception déclenchée si un autre problème survient
// pendant l'accès au fichier ou la fermeture du fichier.
}
}



}


Quand j'éxécute je rentre le fichier ke g enregistré et il apparait Problème I/O null.
ça veut dire que le tableau n'a donc pas été enregistré correctement mais je comprends pas pourquoi... Meme la description n'est pas affichée. je l'ai réécrit en ne lisant que la première case du tableau : ça fonctionnait parfaitement, ensuite je l'ai réécrit en lisant les deux premières cases(ki ont bien sur été enregistrées) : il affiche le résultat de la première et marque null pour la deuxième, pareil avec trois cases lues...
J'en déduit que le programme n'a enregistrer QUE la première case du tableau, même en l'ayant parcouru. C'est incompréhensible non ?
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2008 à 10:30
C'est toujours compréhensible, qu'est ce que tu peux penser de ce comportement ? Ben tout simplement à chaque fois, la derniere case est mal enregistrée.
Typiquement il doit y avoir un problème d'indexage quelque part dans ton programme.

Sinon si tu veux savoir exactement ou arrive l'erreur null, dans le traitement de l'erreur (exception) met ceci :
e.printStackTrace();


Tu aura alors toutes les lignes de ton programme par où ce dernier est passé. Plus la ligne arrive en premier et plus il s'agit de l'endroit où le programme a échoué. Ainsi tu peux savoir sur quelle instruction le programme à planter, et ensuite remonter petit à petit pour comprendre pourquoi il a planté.

Dans ton cas, une NullPointerException veut dire que tu as une données null dont tu essaye de te servir (enregistrer, lire, etc.)

0
J'ai reussi à enregistrer et à lire les tableaux de string ! merci kij_82
0