#1 Le 09/11/2008, à 16:25
- kolmalou
Java et la satanée lecture de fichiers
Bonjour,alors je souhaiterais lire un fichier de la forme suivante :
12
12 12 14
13 14 14
133 122 144
mais voilà je ne comprends pas trop comment ca marche en java il n"y a pas de fonctions comme scanf alors c'est tres embetant.
j'ai essayé un truc comme ca :
public TDemandes lireLeFichier(String fichierNom) throws FileNotFoundException{
BufferedReader fichier = new BufferedReader(new FileReader(fichierNom));
//taille = Integer.parseInt(fichier.readLine( ));
String str;
int cpt=0;
try {
str = fichier.readLine();
while (str != null){
if(cpt==0){ taille= Integer.parseInt(str); }
str = fichier.readLine( );
str.
} catch (IOException e) {
e.printStackTrace();
mais voilà comment decomposé un ligne en fonction des espaces entre les nombres,afin de recuperer leur valeur.
Je suis desole de poser la question comme ca, mais je ne comprends decidement rien à leur truc genre InputStreamReader StringTokenizer etc...
En tout cas merci d'avance pour votre lecture et vos possibles réactions
Hors ligne
#2 Le 09/11/2008, à 16:36
- Respawner
Re : Java et la satanée lecture de fichiers
A t'as place j'aurais fais quelque chose comme ça (si j'ai bien compris ce que tu veux faire).
Je lis le fichier ligne à ligne. Je décompose chaque ligne selon un regex (ici l'espace). Ca me donne un tableau de strings que je parcours, pour chaque élément je le transforme en entier que je met dans un tableau final.
String temp = null;
FileInputStream input = null;
InputStreamReader stream = null;
LineNumberReader reader = null;
Vector<Integer> values = new Vector<Integer>();
try {
input = new FileInputStream(file);
stream = new InputStreamReader(input);
reader = new LineNumberReader(stream);
while ((temp = reader.readLine()) != null) {
String[] tempValues = temp.split(" ");
for (String s : tempValues)
values.add(Integer.parseInt(s));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
stream.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Hors ligne
#3 Le 09/11/2008, à 18:46
- kolmalou
Re : Java et la satanée lecture de fichiers
Ah ok il y a encore quelques points obscurs : Qu'est ce qu'un regex ?
split va en fait prendre toute les string contenues entre des espaces ?
Merci pour ton explication tout devient plus clair !
Hors ligne
#4 Le 09/11/2008, à 19:10
- kolmalou
Re : Java et la satanée lecture de fichiers
Ah et aussi FileInputStream ce qu'il prend en argument est le chemin absolu du fichier ou son nom ?
Hors ligne
#5 Le 09/11/2008, à 19:24
- kolmalou
Re : Java et la satanée lecture de fichiers
Ah et aussi encore il ne faut pas oublier à la fin de la boucle while values.clear();
Hors ligne
#6 Le 09/11/2008, à 19:51
- Respawner
Re : Java et la satanée lecture de fichiers
input = new FileInputStream(file);
J'ai mis "file" mais normalement on doit mettre normalement "new File("Chemin vers fichier");"
Ah et aussi encore il ne faut pas oublier à la fin de la boucle while values.clear();
Si tu fais ça tu vas vider le Vector<Integer> conclusion tu perds toutes les valeurs qu'il y a dedans. Je ne suis pas sûr que c'est ce que tu souhaites faire.
Au niveau du regex ça permet de définir une sorte de délimiteur (un string) entre des champs. Un peu à la manière de la commande "cut". En gros la donc définis un délimiteur qui est seulement un espace. Si t'as ligne du fichier est
12 15 9 50 89
Tu te retrouveras avec un tableau de strings
new String[] { "12", "15", "9", "50", "89" };
Ca dégage les espaces et ça met le reste dans une case par "mot" / "champ" / "valeur" appelles ça comme tu veux
PS : Edite tes messages plutôt que de triple poster ^^
Dernière modification par Respawner (Le 09/11/2008, à 19:52)
Hors ligne
#7 Le 09/11/2008, à 20:08
- kolmalou
Re : Java et la satanée lecture de fichiers
Oui pardon je n'ai pas trop l'habitude !
en fait je le vide car si je ne le fait pas il changera pas au prochain tour de boucle while son contenu..
Hors ligne
#8 Le 09/11/2008, à 20:18
- Respawner
Re : Java et la satanée lecture de fichiers
Si il changera. Je ne sais pas si tu connais la classe Vector. En fait, on peut résumé ça par le fait que c'est un tableau dynamique. En gros tu l'initialises, il est vide et à chaque tonVector.add(machin) tu ajoutes une case avec le contenu machin. Donc finalement avec la boucle while.
while ((temp = reader.readLine()) != null) {
String[] tempValues = temp.split(" ");
for (String s : tempValues)
values.add(Integer.parseInt(s));
}
Tu lis la ligne, tu sépares les valeurs, tu les mets dans le vector, etc... pour chaque itération. Donc finalement ton vector ne fait que grandir et accumule des valeurs, il change donc à chaque itération de la boucle.
Tu peux le vérifier en faisant ceci à chaque itération.
for (Integer i : values) {
System.out.print(i + " / ");
}
Dernière modification par Respawner (Le 09/11/2008, à 20:20)
Hors ligne
#9 Le 09/11/2008, à 20:27
- ®om
Re : Java et la satanée lecture de fichiers
Y'a la classe java.util.Scanner qui aide bien depuis Java 5
Sinon, Vector est "dépréciée" depuis Java 1.2... utilisez ArrayList à la place
Hors ligne
#10 Le 09/11/2008, à 20:37
- Respawner
Re : Java et la satanée lecture de fichiers
Y'a la classe java.util.Scanner qui aide bien depuis Java 5
Sinon, Vector est "dépréciée" depuis Java 1.2... utilisez ArrayList à la place
Exact j'avais pas pensé à Scanner.
T'es sûr que Vector est en deprecated ? Dans la doc online de Java 1.6 je ne vois rien qui indique ceci. D'ailleurs Stack qui hérite de Vector ne l'est pas non plus.
Hors ligne
#11 Le 09/11/2008, à 21:12
- nalian34
Re : Java et la satanée lecture de fichiers
Vector est une classe qui date du tout début de Java, ArrayList a été introduit après et est plus rapide par contre il n'est pas thread-safe à l'instar de Vector
Dernière modification par anirelles (Le 09/11/2008, à 21:13)
Hors ligne
#12 Le 09/11/2008, à 23:17
- rniamo
Re : Java et la satanée lecture de fichiers
+1 pour scanner, trés simple et efficace
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#13 Le 10/11/2008, à 15:46
- kolmalou
Re : Java et la satanée lecture de fichiers
Merci pour vos explication en fait il me faut le vider parce que j'utilise une classe triplet<S,F,G> et donc c'est plus simple pour avoir à chaue tour de boucle seulement les trois voaleurs de la ligne qui m'interesse
Voilà ce que je fait :
while ((temp = reader.readLine()) != null) {
String[] tempValues = temp.split(" ");
for (String s : tempValues){
values.add(Integer.parseInt(s));}
Triplet<Integer,Integer,Integer> triplet = new Triplet<Integer, Integer, Integer>(values.get(0),values.get(1),values.get(2));
tDemandes.add(triplet);
values.clear();
}
C'est pas tres delicat comme ecriture mais bon...
Scanner <=> scanf en c ? Comment ca "déprecié", ca veut dire qu'on evite de l'utiliser ? Si c'est ca c'est bizarre comme vocabulaire
Encore un petit souci de manipulation des tableaux en java, j'ai cette méthode :
public void trieArray(ArrayList<Integer> array,int n){
for( int i=0;i<n;i=i+3){
for(int p=n;p>i;p=p-3){
if(array.get(p)>array.get(p-3)){
int temp = array.get(p);
array.add(p,array.get(p-3));
array.add(p-3,temp);
}
}
}
}
mais c'est tres souvent quand j'utilise des arraylist que j'ai des problemes de :
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 9, Size: 9
Surtout avec cet algorithme de tri...hmm Il y a-t-il un bon moyen simple pour gerer la taille d'une arrayList ?
Ou alors lui faire garder la taille que l"on desire tout le temps ?
/* for(int h=0;h<array.size();h++){
for( int hH=array.size();hH>h;hH--){
if(array.get(hH).getF()<array.get(hH-1).getF()){
Triplet<Integer,Integer,Integer> tri = array.get(hH);
array.add(hH,array.get(hH-1));
array.add(hH-1,tri);
}
}
}*/
J'ai fait ca aussi et pourtant meme erreur...Je m'excuse de vous ennyer avec ca mais comme votre aide m'a deja ete bien utile, je me le permet et puis vous etes libre !
Dernière modification par kolmalou (Le 10/11/2008, à 17:31)
Hors ligne
#14 Le 15/11/2008, à 22:38
- Badaking2
Re : Java et la satanée lecture de fichiers
C'est en 317 ?
#15 Le 15/11/2008, à 23:33
- ®om
Re : Java et la satanée lecture de fichiers
Respawner : Penser en javasection Les conteneurs Java 1.0 / 1.1.
Vector est une classe qui date du tout début de Java, ArrayList a été introduit après et est plus rapide par
contre il n'est pas thread-safe à l'instar de Vector
Stack aussi est "depreciée" (c'est une abération cette implémentation, mais bon c'était le début).
Le fait qu'elle ne soit pas thread-safe est justement un avantage en performances.
Et si on a besion de thread-safe, ce n'est pas pour autant qu'il faut utiliser vector : soit on utilise soi-même les verrous, soit on fait Collections.synchronizedList(new ArrayList<...>()).
Hors ligne
#16 Le 15/11/2008, à 23:45
- Respawner
Re : Java et la satanée lecture de fichiers
@ ®om : Merci pour l'info
Hors ligne
#17 Le 16/11/2008, à 00:04
- Badaking2
Re : Java et la satanée lecture de fichiers
J'ai testé le code suivant car moi aussi j'ai le même problème. Je reçois l'erreur suivante :Exception in thread "main" java.lang.NullPointerException
at Projet.dede.main(dede.java:80)
String temp = null;
FileInputStream input = null;
InputStreamReader stream = null;
LineNumberReader reader = null;
Vector<Integer> values = new Vector<Integer>();
try {
input = new FileInputStream(new File(args[0]"));
stream = new InputStreamReader(input);
reader = new LineNumberReader(stream);
System.out.println(args[0]);
while ((temp = reader.readLine()) != null) {
String[] tempValues = temp.split(" ");
for (String s : tempValues)
values.add(Integer.parseInt(s));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
stream.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}]
Le fichier texte pris en compte dois être passé en argument, mais je ne vois pas comment placer la question "Veuillez taper un nom de fichier" pour exécuter le programme.
Merci d'avance.
#18 Le 16/11/2008, à 00:27
- ®om
Re : Java et la satanée lecture de fichiers
Je sais pas trop ce que tu veux faire, mais ça pourrait t'aider :
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
static class Triplet<T, U, V> {
private T t;
private U u;
private V v;
public Triplet(T t, U u, V v) {
this.t = t;
this.u = u;
this.v = v;
}
@Override
public String toString() {
return "(" + t + ";" + u + ";" + v + ")";
}
}
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Syntax: myprogram filename");
System.exit(1);
}
String filename = args[0];
List<Triplet<Integer, Integer, Integer>> triplets = new ArrayList<Triplet<Integer, Integer, Integer>>();
Scanner scanner = null;
try {
scanner = new Scanner(new File(filename));
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] tokens = line.split(" ");
if (tokens.length == 3) {
int t = Integer.parseInt(tokens[0]);
int u = Integer.parseInt(tokens[1]);
int v = Integer.parseInt(tokens[2]);
Triplet<Integer, Integer, Integer> triplet = new Triplet<Integer, Integer, Integer>(t, u, v);
triplets.add(triplet);
}
}
} finally {
if (scanner != null) {
scanner.close();
}
}
for (Triplet<Integer, Integer, Integer> triplet : triplets) {
System.out.println(triplet);
}
}
}
$ cat /tmp/test
12 12 14
13 14 14
133 122 144
$ java Test /tmp/test
(12;12;14)
(13;14;14)
(133;122;144)
Hors ligne
#19 Le 16/11/2008, à 00:43
- Badaking2
Re : Java et la satanée lecture de fichiers
En fait ce que je veux faire moi aussi, c'est remplir un tableau (en fait une matrice [n][3]) à partir de la lecture d'un fichier texte, donc le nombre de ligne est écris en premier.
Ex :
Dans le fichier texte j'ai:
5
2 3 6
4 5 6
8 8 8
9 8 1
1 3 7
Ce qui me donnerais le tableau suivant :
2 3 6
4 5 6
8 8 8
9 8 1
1 3 7
#20 Le 16/11/2008, à 00:44
- ®om
Re : Java et la satanée lecture de fichiers
Avec mon exemple, tu n'as même pas besoin du nombre de lignes : il s'arrête à la fin du fichier...
Hors ligne
#21 Le 16/11/2008, à 00:54
- ®om
Re : Java et la satanée lecture de fichiers
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Syntax: myprogram filename");
System.exit(1);
}
String filename = args[0];
Scanner scanner = null;
try {
scanner = new Scanner(new File(filename));
String line = scanner.nextLine();
int numberOfLines = Integer.parseInt(line);
int[][] matrix = new int[numberOfLines][];
for (int i = 0; i < numberOfLines; i++) {
line = scanner.nextLine();
String[] tokens = line.split(" ");
matrix[i] = new int[] { Integer.parseInt(tokens[0]), Integer.parseInt(tokens[1]), Integer.parseInt(tokens[2]) };
}
for (int i = 0; i < numberOfLines; i++) {
System.out.println(matrix[i][0] + "\t" + matrix[i][1] + "\t" + matrix[i][2]);
}
} finally {
if (scanner != null) {
scanner.close();
}
}
}
}
$ cat /tmp/test
3
12 12 14
13 14 14
133 122 144
$ java Test2 /tmp/test
12 12 14
13 14 14
133 122 144
Hors ligne
#22 Le 16/11/2008, à 01:16
- Badaking2
Re : Java et la satanée lecture de fichiers
Cela marche bien chez toi ? Quand j'essaie sous eclipse, il me renvoie "Syntax: myprogram filename" ce qui est normal mais si tu sais comment faire pour pouvoir que le programme demande le nom du fichier texte passé en argument, et sinon en passant par le terminal, j'ai plusieurs erreurs :
Exception in thread "main" java.lang.NoClassDefFoundError: proj (wrong name: PROJET/proj)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Je pense que c'est le wrong name là qui pose problème, mais je vois pas comment le résoudre.
Merci de ton aide.
#23 Le 16/11/2008, à 01:31
- ®om
Re : Java et la satanée lecture de fichiers
Va dans le dossier de ton projet (celui qui correspond à aucun package), puis tape simplement :
java Test2 /tmp/test
.
Dans eclipse, clic droit sur le projet → Run as → Run configurations... crée une nouvelle Java Application, et rajoute /tmp/test dans arguments.
Hors ligne
#24 Le 16/11/2008, à 01:52
- Badaking2
Re : Java et la satanée lecture de fichiers
Bizarre bizarre. Mon projet s'appelle Projet, dedans j'ai crée un package proj. Qu'est -ce que je fais de travers pour pas que ça marche en passant par le terminal ? Sous eclipse si je met un nom de fichier en argument, il ne fonctionne pas non plus.
#25 Le 16/11/2008, à 01:54
- ®om
Re : Java et la satanée lecture de fichiers
Tu as mis mon code dans une classe se trouvant dans proj?
Dans ce cas, va dans le répertoire de ton projet, et tape :
java proj.LaClasse /tmp/test
Hors ligne