Lire une partie d'un fichier texte [résolu]

Lire une partie d'un fichier texte [résolu] - Java - Programmation

Marsh Posté le 30-10-2002 à 17:36:41    

ça m'énerve, j'arrive pas à trouver. Je m'y perd avec tous ces flux ds tous les sens !
Voila ce que j'ai besoin de faire :
Lire un fichier à partir d'un offset, sur une longueur donnée, comme fait ici :

Code :
  1. int iPartLength = 30;
  2. int iOffset = 150;
  3. byte[] byData = new byte[iPartLength];
  4. FileInputStream stream   = new FileInputStream (_fMonFIchier);
  5. stream.read (byData, iOffset, iPartLength);


 
Sauf que là je me retrouve avec un tableau de bytes. Comment faire pour obtenir une String ou un tableau de char à partir de ça ? (ou autrement).


Message édité par El_gringo le 31-10-2002 à 18:03:46
Reply

Marsh Posté le 30-10-2002 à 17:36:41   

Reply

Marsh Posté le 30-10-2002 à 17:49:15    

new String(tonTableauDeByte);

Reply

Marsh Posté le 30-10-2002 à 17:55:16    

benou a écrit a écrit :

new String(tonTableauDeByte);




 
et les caractères seront encodés correctement en faisant ça ?

Reply

Marsh Posté le 30-10-2002 à 17:56:52    

bha oui ... ca utilisera l'encodage par défaut de ton OS.
 
sinon, tu peut utiliser un autre encodage : regarde les constructeurs de la classe String

Reply

Marsh Posté le 30-10-2002 à 17:57:05    

en faisant ça :

Code :
  1. int iHeaderLength                          = 30;
  2.         byte[] byData                              = new byte[iHeaderLength];
  3.         FileInputStream fileInputStream            = new FileInputStream(_fArcDir);
  4.         fileInputStream.read (byData, _iOrigin, byData.length);
  5.         ByteArrayInputStream byteArrayInputStream  = new ByteArrayInputStream (byData);
  6.         InputStreamReader inputStreamReader        = new InputStreamReader (byteArrayInputStream);
  7.         BufferedReader bf                          = new BufferedReader (inputStreamReader);
  8.         char[] charBuffer    = new char[iHeaderLength];
  9.         int iOffset          = bf.read(charBuffer, _iOrigin, charBuffer.length);


 
Je m'embête pour pas grand chose ?
Et puis je comprend pas, j'ai toujours une IndexOutOfBoundException au moment de la lecture de la partie qui m'interresse depuis le fichier (fileInputStream.read (byData, _iOrigin, byData.length);)

Reply

Marsh Posté le 30-10-2002 à 18:04:34    

Si tu utilisais des Reader au lieu d'utiliser des InputStream, ça irait sans doute mieux !  :sarcastic:
Un Reader lit un flux de caractères (du texte, donc), alors qu'InputStream lit un flux d'octets (du binaire, donc).

Code :
  1. int            iHeaderLength = 30;
  2. char[]         charBuffer    = new char[iHeaderLength];
  3. BufferedReader reader        = new BufferedReader(new FileReader(_fArcDir));
  4. int            iOffset       = reader.read(charBuffer, _iOrigin, charBuffer.length);


C'est pas plus simple, comme ça ?  :sarcastic:  :D
 
Et puis, au cas où cela t'intéresserait, BufferedReader sait aussi lire des lignes entières (BufferedReader.readLine()).


Message édité par BifaceMcLeOD le 30-10-2002 à 18:06:14
Reply

Marsh Posté le 30-10-2002 à 18:06:39    

oui !
 

Code :
  1. Reader fileReader = new FileReader(_fArcDir);
  2. BufferedReader stream = new BufferedReader(fileReader );
  3. String taString = stream.readLine();

 
 
ca devrait t'aller ca non ?
 
(j'ai pas vérifier mon caode mais ca doit être ca en gros)


Message édité par benou le 30-10-2002 à 18:07:30
Reply

Marsh Posté le 30-10-2002 à 18:07:07    

arg !!! méga-grilled !

Reply

Marsh Posté le 30-10-2002 à 18:10:45    

:D

Reply

Marsh Posté le 30-10-2002 à 19:22:52    

BifaceMcLeOD a écrit a écrit :

Si tu utilisais des Reader au lieu d'utiliser des InputStream, ça irait sans doute mieux !  :sarcastic:
Un Reader lit un flux de caractères (du texte, donc), alors qu'InputStream lit un flux d'octets (du binaire, donc).

Code :
  1. int            iHeaderLength = 30;
  2. char[]         charBuffer    = new char[iHeaderLength];
  3. BufferedReader reader        = new BufferedReader(new FileReader(_fArcDir));
  4. int            iOffset       = reader.read(charBuffer, _iOrigin, charBuffer.length);


C'est pas plus simple, comme ça ?  :sarcastic:  :D
 
Et puis, au cas où cela t'intéresserait, BufferedReader sait aussi lire des lignes entières (BufferedReader.readLine()).




 
Non, ça ça me va pas justement (ms apparement, ce que j'ai fait c'est pas mieux !).
Moi je voudrais lire les 30 premiers octets de mon fichier, pas tout le fichier (il est énorme !).
La ligne suivante :

Code :
  1. reader.read(charBuffer, _iOrigin, charBuffer.length);

Que me propose Biface, c'est pas du tout ça (g essayé avant !). Cette méthode écrit dans le tableau charBuffer[] les caractères lus depuis le fichier, jusqu'a à la fin de ce fichier ou jusqu'a ce que le nombre de bytes à lire à été lu (ici charBuffer.length). Dans ce fonction, l'offset concerne le tableau de bytes, pas le fichier.
C à dire qu'avec la méthode que Biface me donne, ça va faire ça :
lire les 30 premiers octets du fichier _fArcDir
les stocker dans charBuffer à partir de l'index _iOrigin
 
Moi j'ai besoin de :
lire 30 octets à partir du _iOrigin ième octet du fichier
les stocker dans charBuffer (à partir de l'index 0 bien sûr !)

Reply

Marsh Posté le 30-10-2002 à 19:22:52   

Reply

Marsh Posté le 30-10-2002 à 19:23:34    

Donc, non, readline ça ma va pas du tout !

Reply

Marsh Posté le 31-10-2002 à 08:41:15    

Oula, c'est qu'il a chuté ce topic !

Reply

Marsh Posté le 31-10-2002 à 09:48:01    

Un petit bout de code comme ca ?
 
 
        try{
            FileInputStream inFile = new FileInputStream(new File(nomFichier));
            while ((octet = inFile.read()) != -1 && (!trouve)) {
.....


---------------
Evite les personnes arrogantes et vulgaires, elles sont un tourment pour l'esprit.
Reply

Marsh Posté le 31-10-2002 à 09:51:40    

persepolis a écrit a écrit :

Un petit bout de code comme ca ?
 
 
        try{
            FileInputStream inFile = new FileInputStream(new File(nomFichier));
            while ((octet = inFile.read()) != -1 && (!trouve)) {
.....




 
...oula, ça veut dire parcourir tout le fichier avant de m'arrêter à l'octet qui m'interresse !? ça risque de prendre pas mal de temps vu la taille de mes fichiers.
J'aurais préféré autre chose qu'une lecture séquentielle !

Reply

Marsh Posté le 31-10-2002 à 10:05:21    

Essaie d'utiliser Reader.skip(n).

Reply

Marsh Posté le 31-10-2002 à 11:13:02    

Bon, finalement j'ai trouvé, avec RandomAccessFile.
Desfois que ça interresserai qqn :

Code :
  1. int iTockenSize                          = 30;
  2.         byte[] byData                            = new byte[iTockenSize];
  3.         RandomAccessFile randomAccessFile        = new RandomAccessFile(_fArcDir, "r" );
  4.         randomAccessFile.seek(_iOrigin);
  5.         randomAccessFile.read(byData);
  6.         String strToks         = new String (byData);

Reply

Marsh Posté le 04-11-2002 à 11:38:36    

:jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed