FileInput Stream

siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005 - 30 mai 2005 à 12:07
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 - 2 juin 2005 à 23:46
SAlut a tous,

jai un souci avec mon code , au niveau du fileinputstream, et je comprends pas pourquoi le compilateur me dit "unreported exception java.io.filenotfoundexception...

import java.util.Vector;
import java.io.FileInputStream;
import java.io.File;
import java.lang.String;


/**
*
* @author Siropipo
*/
public class Main {

/** Creates a new instance of Main */
public Main() {
}

/**
* @param args the command line arguments
*/

private void lectureFichier ()
{
Vector VecFichier = new Vector ();
File dossier = new File ("c:/test/");

if (!dossier.isDirectory ())
{
dossier.mkdirs ();
}

File fichier = new File (dossier+"test.txt");
FileInputStream ficin = new FileInputStream(fichier);

byte [] tab = null;
int pos = 0;

ficin.read (tab,pos,4);
String str = new String (tab);
int res = heXToInt(str);

if (result == ficIn.read(tab,pos,result))
{

}

for (; pos < result + 4;)
{
ficIn.read(tab,pos,2);
str = new String (tab);
int res = hexToInt(str);
ficIn.read(tab,pos,res);
}
}

private int heXToInt (String nombreHex)
{
int pos = 0;
int sum = 0;
int multiple = 1;
for (int ind = nombreHex.length () ; ind != 0 ; --ind)
{
for (int i = 0 ; i < pos ; ++i)
{
multiple *= 16;
}
sum += multiple * (nombreHex.charAt(ind) - '0');
}
return sum;
}

}

et apres jai fais une fonction hexa => decimal mais bon je doute que ca soit comme ca...
Si vous pouviez me filler la main.
mici ;)

17 réponses

cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
30 mai 2005 à 13:42
Le constructeur d'un FileInputStream renvoie une java.io.FileNotFoundException.
Tu dois mettre :

FileInputStream ficin;
try{
ficin = new FileInputStream(fichier);
}catch(FileNotFoundException fnfe){
System.out.println("Fichier non trouvé");
}

De même tu dois encadrer ton bloc de lecture par:
try{
...
ficin.read(...);
...
}catch(IOException ioe){
System.out.println("Erreur de lecture");
}
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
30 mai 2005 à 14:03
salut !

merci a toi, je viens de voir mon erreur... javais corriger jusqu'a
catch(IOException ioe){
System.out.println("Erreur de lecture");
}
ca je savais pas comment le faire..
Merci bicoup.

une ot question :
comment l'integrer a un main ?
0
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
30 mai 2005 à 18:18
Pour démarrer un programme, tu dois avoir une fonction qui appelle le constructeur de ta classe.



public static void main (String args[]){



Main m = new Main();



}



Dans ton constructeur, tu peux écrire:



public Main(){

LectureFichier();

}



Je te conseille de mettre ton constructeur public et non pas private.
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
31 mai 2005 à 13:54
salut a tous !

Merci pour vos reponses
jarrive pas a lintegrer dans un main.

jai fais deux fichier un main.java

import java.util.Vector;
import java.io.*;
import java.lang.String;
import java.io.FileNotFoundException;

public class Main
{
public static void main (String args[])throws Exception
{
Main m = new Main();
LectureFichier();
}


}

et un xml.java avec la fonction lecture fichier :
import java.util.Vector;
import java.io.*;
import java.lang.String;
import java.io.FileNotFoundException;


public class XML
{

public void LectureFichier ()
{
try
{
Vector VecFichier = new Vector ();
File dossier = new File ("c:/test/");

if (!dossier.isDirectory ())
{
dossier.mkdirs ();
}

File fichier = new File (dossier+"test.txt");
FileInputStream ficin = new FileInputStream(fichier);

byte [] tab = null;
int pos = 0;

ficin.read (tab,pos,4);
System.out.println(tab);
String str = new String (tab);
System.out.println(str);

int res = Integer.parseInt(str, 16);
if(pos==0)
{
}
}

catch (FileNotFoundException ficin )
{
System.out.println ("Exception :" + ficin);
}
catch(IOException ioe)
{
System.out.println("Erreur de lecture");
}


}

}

ah au fait au niveau de la conversion hexa -> decimal jai trouvé ca :

int res = Integer.parseInt(str, 16);

Voili si vous pouviez m'eclaircir sur le main.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
31 mai 2005 à 19:06
Si tu veux mettre ta fonction de lecture dans la classe XML sans avoir
de constructeur pour cette classe, tu dois mettre ta fonction
lectureFichier static: public void static LectureFicher().



En suite tu l'appel dans ta fonction main avec XML.LectureFichier().



Mais pourquoi fais tu une classe Main et une autre classe XML?
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
31 mai 2005 à 19:35
on ma dit de faire deux classes.
Mais si une suffit alors je nen ferai qu'une.
mais je comprends pas en fait.
ma fonction lecture fichier et public static void main (String args[])throws Exception vont dans la classe main ? et celle la public Main() je la met ou ?

dans void main (string... on met juste Main m = new Main(); ??

est ce ke jai bien tout compris ?

@+ mici bien
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
31 mai 2005 à 21:41
Re Salut !

bon jai reglé mon pb de main.

Now jai une erreur de run :
Exception :java.lang.NullPointerException
ca correspond a la ligne :
ficin.read (tab,pos,4); <<====
System.out.println(tab);
String str = new String (tab);
System.out.println(str);

serais-ce parceque je n'est pas instancié ma fonction oparavant ? comment faire ?
Merci bien ;)
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
31 mai 2005 à 23:35
apparament ca serais parceque mon logiciel eclipse ne serai pas bien configuré....
kelkun peut il maider ?
mici
@plousse !
0
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
1 juin 2005 à 07:06
Il faut que ton tab soit initialisé à une taille pour lire lle contenu du fichier, par exemple

byte[] tab = new byte[4];
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
1 juin 2005 à 10:01
Mais le pb c ke la taille n'est pas fixe. elle est defini par les quatre premier byte.
je vais essayer de faire deux tableau.
byte[] tab = new byte[4]; le premier ki recupere la taille et lotre ki varie en fonction de cette taille.
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
1 juin 2005 à 10:46
Re !

jai changé le code comme tu ma dit :

byte[] tab = new byte[4];
int pos = 0;


ficIn.read(tab, pos, 4);
String str = new String(tab);
System.out.println(str);

int res = Integer.parseInt(str, 16);
System.out.println(res);

res *= 2;

byte[] tabb = new byte[res];
ficIn.read(tabb, 4, res); <===== now l'erreur est la.
str = new String(tabb);
System.out.println(str);

if (res != ficIn.read(tab, 0, res))
{
System.out.println("Crc invalide");
}



for (; pos < res;)
{

byte[] id = new byte[2];
pos = ficIn.read(id, pos, 2);
str = new String(id);
System.out.println(str);
//lecture fichier xml

byte[] len = new byte[2];
ficIn.read(len, pos, 2);
str = new String(len);
int longueur = Integer.parseInt(str, 16);
System.out.println(longueur);

pos += longueur;
pos = ficIn.read(tab, pos, longueur);
//lecture fichier xml
}
}

Comment on fait pour initialiser un tableau a zero ?
la jai le droit a cette belle erreur :


Exception in thread "main" java.lang.IndexOutOfBoundsException


at java.io.FileInputStream.readBytes(Native Method)


at java.io.FileInputStream.read(Unknown Source)


at Main.LectureFichier(Main.java:44)


at Main.(Main.java:15)


at Main.main(Main.java:11)

;)

@+ mici
0
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
1 juin 2005 à 19:10
Peux tu donner l'affichage des System.out?

Quel est la valeur de res?

Tu pourrais mettre ficIn.read(tabb,4, tabb.length);
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
1 juin 2005 à 21:33
Le str renvoie 0023.
res renvoi la valeur 35... ce qui reprensente en fait 35 pair d'octet a recuperer par la suite.
ton avis ?
est ce que ca peux venir de la configuration du logiciel eclipse ?

bonne soiré
0
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
1 juin 2005 à 23:09
Normalement non,

Essaie de mettre tabb.length à la place de res dans ton instruction de lecture.

Essaie d'afficher la longueur de ton tableau avant de lire.

Essaie de voir si cela ne peut pas venir de l'offset où tu commence ta lecture (réduis-le).



Si cela ne marche toujours pas, j'exécuterais ton code demain.



Bonne nuit
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
2 juin 2005 à 11:54
Je crois que jai trouvé, kan je fait ficIn.read(wibCode,0,res); , ca lit a partir de la ou le cruseur c'est arrété au curseur précedent.

jai modifié mon code jai fait ca :
byte[] tab = new byte[4];
int pos = 0;


ficIn.read(tab, pos, 4); //il me lit les bien les 4 premiers chiffres
String str = new String(tab);
System.out.println(str);

int res = Integer.parseInt(str, 16);
System.out.println(res);

res *= 2;

byte[] wibCode = new byte[res];
ficIn.read(wibCode,0,res); // en mettant 0 ca marche car il repart de l'offset sur lekel il c'est arrété.
str = new String(wibCode);
System.out.println(str);

Comment faire pour faire revenir l'offset a zero ?
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
2 juin 2005 à 12:21
Re c encore moi. bon jai reglé le pb regarde :
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.String;
import java.util.Vector;


public class Main {


public static void main(String args[]) throws Exception {
Main m = new Main();
}


public Main() {
LectureFichier();
}


public void LectureFichier() {
try {
Vector VecFichier = new Vector();
File dossier = new File("c:/test/");


if (!dossier.isDirectory()) {
dossier.mkdirs();
}


File fichier = new File(dossier, "test.txt");
FileInputStream ficIn = new FileInputStream(fichier);


//byte [] tab = null;
byte[] tab = new byte[4];
int pos = 0;


ficIn.read(tab, pos, 4);
String str = new String(tab);
System.out.println(str);
int res = Integer.parseInt(str, 16);
System.out.println(res);
res *= 2;

/* byte[] wibCode = new byte[res];
ficIn.read(wibCode,0,res);
str = new String(wibCode);
System.out.println(str);
//ecriture Xml

if (res != ficIn.read(tab,0, res))
{
System.out.println("Crc invalide");
}*/

for (; pos < res;)
{
byte[] id = new byte[2];
ficIn.read(id,0,2);
str = new String(id);
System.out.println(str);
pos += 2;
//lecture fichier xml
//ecriture Xml

byte[] len = new byte[2];
ficIn.read(len,0,2);
str = new String(len);
int longueur = Integer.parseInt(str,16);
longueur *= 2;
System.out.println(longueur);
pos += 2;

byte[] donnee = new byte[longueur];
ficIn.read(donnee,0,longueur);
str = new String(donnee);
System.out.println(str);
pos += longueur;
//lecture fichier xml
//ecriture Xml
}
}


catch (FileNotFoundException ficin) {
System.out.println("Exception :" + ficin);
} catch (IOException ioe) {
System.out.println("Erreur de lecture");
} catch (NullPointerException ficin) {
System.out.println("Exception :" + ficin);
}


}


}

Now il faut que je parse du xml. ca ma pas lair compliké mais je c pas trop par ou commencé.
tu peux maider pour le xml ?
0
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
2 juin 2005 à 23:46
Tu peux soit te faire une fonction à la main (ce que je me suis fait)
soit utiliser des technologie comme DOM pour parser. Je ne l'ai pas
encore implémenté. Si tu veux, je pourrais te donner quelques infos
demain.
0
Rejoignez-nous