Lecture Ecriture Binaire

Lecture Ecriture Binaire - Java - Programmation

Marsh Posté le 19-09-2005 à 13:35:05    

Il me faut lire les données d'un fichier .txt pour le transformer en un fichier binaire.  
J'ai implémenté tout ça et je vous donne un exemple avec mon code.  
A chaque fois que je capture un caractère pour le transformer en binaire et que je souhaite ensuite lire le binaire pour vérifier si c'est le bon caractère, il me sort des entiers à 6 chiffres louches :O  
Et puis j'ai lu que la DataInputStream ne permet que de lire les types numériques.  
Comment lire les types char ??  
 
Une autre question svp:  
Comment écrire dans un fichier avec le DataOutputStream sans écraser ce qu'on a ecrit auparavant.  
Je sais qu'avec les bufferedWriter, on ecrit  
 

Code :
  1. BufferedWriter bw = new BufferedWriter(new FileWriter("nom_du_fichier",true));

 
 
avec le mot clé true.  
Existe-t-il un truc semblable pour DataOutputStream ??  
 
Voici un extrait du fichier .txt avec des entiers, des caractères...  
 
     

Code :
  1. 11      3      32      0      7      40     
  2.       5520      1      1      1      5      5     
  3.       32* COFI v.2 IDEAS v.11 *                                                 
  4.         07/13/05                        VVPR       1       0       0


 
Voici mon code pour lire le fichier .txt  
 

Code :
  1. public class Creatbin {
  2.   public void parse_vvp0() {
  3.     try {
  4.    BufferedReader br = new BufferedReader (new FileReader("sphere.txt" ));
  5.    DataOutputStream out=new DataOutputStream(new FileOutputStream("sphere.bin" ));
  6.    StreamTokenizer st = new StreamTokenizer(new FileReader("sphere.txt" ));
  7.    //je lis les 12 premiers entiers des deux premières lignes  
  8.    for (int i=0; i<2; i++) {
  9.       String ligne1 = br.readLine();
  10.       StringTokenizer stk = new StringTokenizer(ligne1);
  11.       for (int j=0; j<6; j++) {
  12.          int entier = Integer.parseInt(stk.nextToken());
  13.          System.out.println(entier);
  14.          out.writeInt(entier);
  15.       }
  16.    }
  17.     }
  18.     catch (Exception ex) {
  19.    System.exit(0);
  20.     }   
  21.   }
  22.   public void parse_vvp1() {
  23.     try {
  24.    BufferedReader br = new BufferedReader (new FileReader("sphere.txt" ));
  25.    DataOutputStream out=new DataOutputStream(new FileOutputStream("sphere.bin" ));
  26.    for (int i=0; i<2; i++) {
  27.       br.readLine();
  28.    }
  29.    
  30.    //je lis la ligne 3 en la découpant, formant ainsi 6 tokens  
  31.    String ligne3 = br.readLine();
  32.    StringTokenizer stk0 = new StringTokenizer(ligne3);
  33.    System.out.println(ligne3);
  34.    for (int i=0;i<6;i++) {
  35.       String token_ligne3 = ""+stk0.nextToken();
  36.       System.out.println(token_ligne3);
  37.       out.writeChars(token_ligne3);
  38.    }
  39.    
  40.    //je lis la 4ème ligne  
  41.    String ligne4 = br.readLine();
  42.    System.out.println(ligne4);
  43.    StringTokenizer stk = new StringTokenizer (ligne4);
  44.    
  45.    //je lis le 1er token de la 4ème ligne c'est-à-dire "07/08/05"  
  46.    String token1_ligne4 = "" + stk.nextToken();
  47.    System.out.println(token1_ligne4);
  48.    out.writeChars(token1_ligne4);
  49.    
  50.    String token2_ligne4 = "" + stk.nextToken();
  51.    System.out.println(token2_ligne4);
  52.    out.writeChars(token2_ligne4);
  53.    int token3_ligne4 = Integer.parseInt(stk.nextToken());
  54.    System.out.println(token3_ligne4);
  55.    out.writeInt(token3_ligne4);
  56.    int token4_ligne4 = Integer.parseInt(stk.nextToken());
  57.    System.out.println(token4_ligne4);
  58.    out.writeInt(token4_ligne4);
  59.    int token5_ligne4 = Integer.parseInt(stk.nextToken());
  60.    System.out.println(token5_ligne4);
  61.    out.writeInt(token5_ligne4);   
  62.     }
  63.     catch (Exception ex) {
  64.    System.exit(0);
  65.     }   
  66.   }
  67. public static void main (String [ ] args){
  68.     try {
  69.    BufferedReader br = new BufferedReader (new FileReader("sphere.txt" ));
  70.    DataOutputStream out=new DataOutputStream(new FileOutputStream("sphere.bin" ));
  71.    StreamTokenizer st = new StreamTokenizer(new FileReader("sphere.txt" ));
  72.    Creatbin bb = new Creatbin();
  73.    bb.parse_vvp0();
  74.    bb.parse_vvp1();
  75. }
  76.       catch (IOException ex ) {
  77.             System.out.println(ex);
  78.        }
  79.   }
  80. }


 
voici mon code pour lire le fichier binaire et ainsi vérifier s'il est bon  
 

Code :
  1. public class Lectbin {
  2.   public static void main (String [ ] args){
  3.     try {
  4.    DataInputStream fic=new DataInputStream(new FileInputStream("sphere.bin" ));
  5.    for (int i=0; i<12; i++) {
  6.       int d = fic.readInt();
  7.       System.out.println(d);
  8.    }
  9.    
  10.    for (int i=0; i<3; i++) {
  11.       char c = fic.readChar();
  12.       System.out.println(c);
  13.    }
  14.    for (int i=0; i<4; i++) {
  15.       char c = fic.readChar();
  16.       System.out.println();
  17.    }
  18.    for (int i=0; i<3; i++) {
  19.       char c = fic.readChar();
  20.       System.out.println();
  21.    }
  22.    for (int i=0; i<5; i++) {
  23.       char c = fic.readChar();
  24.       System.out.println();
  25.    }
  26.    for (int i=0; i<4; i++) {
  27.       char c = fic.readChar();
  28.       System.out.println();
  29.    }
  30.    char c = fic.readChar();
  31.       System.out.println();
  32.    for (int i=0; i<3; i++) {
  33.       int entier = fic.readInt();
  34.       System.out.println(entier);
  35.    }   
  36.       fic.close();
  37.     } catch (IOException ex ) {
  38.       System.out.println(ex);
  39.     }
  40.   }
  41. }


 
c'est pas très beau ....  
Merci beaucoup pour votre aide

Reply

Marsh Posté le 19-09-2005 à 13:35:05   

Reply

Marsh Posté le 19-09-2005 à 14:44:04    

Il n'y a pas de "true" pour DataOutputStream mais il peut se préciser à la construction du FileOutputStream ( que tu fournit au constrcuteur du DataOutputStream ).
 
Data*Stream permet de lire/écrire des données de type pimitif java. "char" en fait partie.
 
Erreur classique en java : confondre le "char" de ascii/c/c++/... ( 1 octet ) avec le char de java ( 2 octets ). A vérifier.
 
Une trace d'exécution serait bienvenue.
 
 
 

Reply

Marsh Posté le 19-09-2005 à 14:52:41    

Autres remarques
- après avoir écrit à l'aide de DataOutputStream.writeXXX, tu ne vide pas le tampon ---> Résultats aléatoire garantis !!!!
- Tu ne fermes pas non plus explicitement tes flux ---> meme type de résultats que cité précédemment.
 Ca commence à faire beaucoup, je trouve ça limite brouillon, alors un petit effort...
 
 

Reply

Marsh Posté le 19-09-2005 à 17:30:49    

salut  
Merci pour ton aide
J'avais effectivement oublié de fermer les flux a chaque fois  :whistle:  
Ca marche nikel avec true dans la construction de FileOuputStream.
Cependant j'ai un souci avec mon code plus grave je pense. Ca fait 5 heures que j'ai le crane qui chauffe sans résultats.
Si tu pouvais jeter un coup d'oeil ...
Je t'explique :
Dans ma classe j'ai 5 fonctions (on les appelle fonctions 0 à 4). Pour l'instant je me fiche de la 2ème (parse_vvp1).
Ensuite, je crée ma fonction main. Je crée une nouvelle instance de la classe, et j'appelle les fonctions.
Lorsque j'appelle les fonctions 0, 2, 3 et 4; ça compile et s'exécute sans erreur mis à part le fait que la fonction 4 n'est pas exécuté alors que les 3 premières le sont. J'ai donc essayé de comprendre. J'ai seulement appellé la fonction 4; et là elle s'execute sans probleme. C'est à n'y rien comprendre.
J'ai essayé autre chose: j'ai mis le code de la fonction 4 à la fin de la fonction précédente, et je les appelle toutes sauf la 4 évidemment. Résultat: les fonctions s'executent toutes et la partie du code que j'ai rajoutée ne s'exécute pas....  :sarcastic:  :??:  
J'espère que j'ai été assez clair
 
Voici le code

Code :
  1. import java.io.*;
  2. import java.util.*;
  3. import java.lang.*;
  4. import java.text.NumberFormat.*;
  5. public class Creatbin {
  6.   public void parse_vvp0() {
  7.     try {
  8. BufferedReader br = new BufferedReader (new FileReader("sphere.txt" ));
  9. DataOutputStream out=new DataOutputStream(new FileOutputStream("sphere.bin",true));
  10. StreamTokenizer st = new StreamTokenizer(new FileReader("sphere.txt" ));
  11. for (int i=0; i<2; i++) {
  12.  String ligne_vvp0 = br.readLine();
  13.  StringTokenizer stk = new StringTokenizer(ligne_vvp0);
  14.  for (int j=0; j<6; j++) {
  15.   int entier = Integer.parseInt(stk.nextToken());
  16.   //System.out.println(entier);
  17.   out.writeInt(entier);
  18.  }
  19. }
  20. br.close();
  21. out.close();
  22.     }
  23.     catch (Exception ex) {
  24. System.exit(0);
  25.     }
  26.   }
  27.   public void parse_vvp1() {
  28.     try {
  29. BufferedReader br = new BufferedReader (new FileReader("sphere.txt" ));
  30. DataOutputStream out=new DataOutputStream(new FileOutputStream("sphere.bin",true));
  31. for (int i=0; i<2; i++) {
  32.  br.readLine();
  33. }
  34. String ligne1 = br.readLine();
  35. StringTokenizer stk0 = new StringTokenizer(ligne1);
  36.  System.out.println(ligne1);
  37. for (int i=0;i<6;i++) {
  38.  String token1_ligne1 = ""+stk0.nextToken();
  39.  System.out.println(token1_ligne1);
  40.  out.writeChars(token1_ligne1);
  41. }
  42. String ligne2 = br.readLine();
  43. System.out.println(ligne2);
  44. StringTokenizer stk = new StringTokenizer (ligne2);
  45. String token1_ligne2_vvpr1 = "" + stk.nextToken();
  46. System.out.println(token1_ligne2_vvpr1);
  47. out.writeChars(token1_ligne2_vvpr1);
  48. String token2_ligne2_vvpr1 = "" + stk.nextToken();
  49. System.out.println(token2_ligne2_vvpr1);
  50. out.writeChars(token2_ligne2_vvpr1);
  51. int token3_ligne2_vvpr1 = Integer.parseInt(stk.nextToken());
  52. System.out.println(token3_ligne2_vvpr1);
  53. out.writeInt(token3_ligne2_vvpr1);
  54. int token4_ligne2_vvpr1 = Integer.parseInt(stk.nextToken());
  55. System.out.println(token4_ligne2_vvpr1);
  56. out.writeInt(token4_ligne2_vvpr1);
  57. int token5_ligne2_vvpr1 = Integer.parseInt(stk.nextToken());
  58. System.out.println(token5_ligne2_vvpr1);
  59. out.writeInt(token5_ligne2_vvpr1);
  60. br.close();
  61. out.close();
  62.     }
  63.     catch (Exception ex) {
  64. System.exit(0);
  65.     }
  66.   }
  67.   public void parse_vvp2() {
  68.     try {
  69. BufferedReader br = new BufferedReader (new FileReader("sphere.txt" ));
  70. DataOutputStream out=new DataOutputStream(new FileOutputStream("sphere.bin",true));
  71. StreamTokenizer st = new StreamTokenizer(new FileReader("sphere.txt" ));
  72. for (int i=0; i<4; i++) {
  73.  br.readLine();
  74. }
  75. String ligne_vvp2 = br.readLine();
  76. StringTokenizer stk = new StringTokenizer(ligne_vvp2);
  77. for (int i=0; i<8; i++) {
  78.  int entier = Integer.parseInt(stk.nextToken());
  79.  //System.out.println(entier);
  80.  out.writeInt(entier);
  81. }
  82. br.close();
  83. out.close();
  84.     }
  85.     catch (Exception ex) {
  86. System.exit(0);
  87.     }
  88.   }
  89.   public void parse_vvp3() {
  90. String tmp3 = "";
  91. String ligne = "";
  92. int num;
  93. int NbVecProp;
  94. int num1;
  95. int NbValProp;
  96. int num2;
  97.     try {
  98. StreamTokenizer st = new StreamTokenizer(new FileReader("sphere.txt" ));
  99. BufferedReader br = new BufferedReader(new FileReader("sphere.txt" ));
  100. DataOutputStream out=new DataOutputStream(new FileOutputStream("sphere.bin",true));
  101. for (int i=0; i<5; i++) {
  102.  st.nextToken();
  103. }
  104. st.nextToken();
  105. NbVecProp = (int)st.nval;
  106. //System.out.println("Nombre de vecteurs propres : " + NbVecProp);
  107. st.nextToken();
  108. NbValProp = (int)st.nval;
  109. //System.out.println("Nombre de valeurs propres : " + NbValProp);
  110. num1 = (NbVecProp/2);
  111. //System.out.println("Nombre de vecteurs propres divisé par 2 : " + num1);
  112. num2 = NbValProp/2;
  113. //System.out.println("nombre de valeurs dans la vvpr4 : "+ num2);
  114. double NbVecProp2 = (double)NbVecProp;
  115. double nb_lg_vvp3 = (NbVecProp2/2)/3;
  116. //System.out.println("nb_lg_vvp3 "+nb_lg_vvp3);
  117. int nb_lg_vvpr3 = (int)Math.ceil(nb_lg_vvp3);
  118. //System.out.println("nb_lg_vvpr3 "+nb_lg_vvpr3);
  119. for (int i=0; i<5; i++) {
  120.  br.readLine();
  121. }
  122. String ligne1_vvpr3 = br.readLine();
  123. //System.out.println(ligne1_vvpr3);
  124. StringTokenizer stk3 = new StringTokenizer(ligne1_vvpr3);
  125. int tok1 = Integer.parseInt(stk3.nextToken());
  126. //System.out.println("tok1 : "+tok1);
  127. out.writeInt(tok1);
  128. for (int i=0; i<3; i++) {
  129.  double tok = Double.parseDouble(stk3.nextToken());
  130.  //System.out.println("tok : "+ tok);
  131.  out.writeDouble(tok);
  132. }
  133. for (int i=0; i<(nb_lg_vvpr3 - 1); i++) {
  134.  String lin_vvp3 = br.readLine();
  135.  //System.out.println("ligne "+i+":" + lin_vvp3);
  136.  StringTokenizer stk4 = new StringTokenizer (lin_vvp3);
  137.  for (int j=0; j<3; j++) {
  138.   double s = Double.parseDouble(stk4.nextToken());
  139.   System.out.println("valeur "+i+": "+s);
  140.   out.writeDouble(s);
  141.  }
  142. }
  143. //ici je rajoute le code de la fonction parse_vvp4
  144. String ligne1_vvpr4 = br.readLine();
  145. System.out.println(ligne1_vvpr4);
  146. StringTokenizer stk4 = new StringTokenizer(ligne1_vvpr4);
  147. int tok1_vvp4 = Integer.parseInt(stk4.nextToken());
  148. System.out.println("Premier token Premiere ligne vvp4 : "+tok1_vvp4);
  149. out.writeInt(tok1_vvp4);
  150. for (int i=0; i<3; i++) {
  151.  double tok_vvp4 = Double.parseDouble(stk4.nextToken());
  152.  System.out.println("valeur "+i+" de la premiere ligne vvp4 :" + tok_vvp4);
  153.  out.writeDouble(tok_vvp4);
  154. }
  155. int nbLignes_vvp4 = (num2-3)/3;
  156. System.out.println(nbLignes_vvp4);
  157. for (int i=0; i<nbLignes_vvp4; i++) {
  158.  String lignes_vvp4 = br.readLine();
  159.  StringTokenizer stkk = new StringTokenizer(lignes_vvp4);
  160.  for (int j=0; j<3; j++) {
  161.   double valeurs_vvp4 = Double.parseDouble(stkk.nextToken());
  162.   System.out.println(valeurs_vvp4);
  163.   out.writeDouble(valeurs_vvp4);
  164.  }
  165. }
  166. br.close();
  167. out.close();
  168.     }
  169.     catch (Exception ex) {
  170.       System.exit(0);
  171.     }
  172.   }
  173.   public void parse_vvp4() {
  174. String tmp3 = "";
  175. String ligne = "";
  176. int num;
  177. int NbVecProp;
  178. int num1;
  179. int NbValProp;
  180. int num2;
  181.     try {
  182. StreamTokenizer st = new StreamTokenizer(new FileReader("sphere.txt" ));
  183. BufferedReader br = new BufferedReader(new FileReader("sphere.txt" ));
  184. DataOutputStream out=new DataOutputStream(new FileOutputStream("sphere.bin",true));
  185. for (int i=0; i<5; i++) {
  186.  st.nextToken();
  187. }
  188. st.nextToken();
  189. NbVecProp = (int)st.nval;
  190. System.out.println("Nombre de vecteurs propres : " + NbVecProp);
  191. st.nextToken();
  192. NbValProp = (int)st.nval;
  193. System.out.println("Nombre de valeurs propres : " + NbValProp);
  194. num1 = (NbVecProp/2);
  195. System.out.println("Nombre de vecteurs propres divisé par 2 : " + num1);
  196. num2 = NbValProp/2;
  197. System.out.println("nombre de valeurs dans la vvpr4 : "+ num2);
  198. double NbVecProp2 = (double)NbVecProp;
  199. double nb_lg_vvp3 = (NbVecProp2/2)/3;
  200. System.out.println("nb_lg_vvp3 "+nb_lg_vvp3);
  201. int nb_lg_vvpr3 = (int)Math.ceil(nb_lg_vvp3);
  202. System.out.println("nb_lg_vvpr3 "+nb_lg_vvpr3);
  203. for (int i=0; i<5; i++) {
  204.  br.readLine();
  205. }
  206. for (int i=0; i<nb_lg_vvpr3; i++) {
  207.  br.readLine();
  208. }
  209. String ligne1_vvpr4 = br.readLine();
  210. System.out.println(ligne1_vvpr4);
  211. StringTokenizer stk4 = new StringTokenizer(ligne1_vvpr4);
  212. int tok1 = Integer.parseInt(stk4.nextToken());
  213. System.out.println("Premier token Premiere ligne vvp4 : "+tok1);
  214. out.writeInt(tok1);
  215. for (int i=0; i<3; i++) {
  216.  double tok = Double.parseDouble(stk4.nextToken());
  217.  System.out.println("valeur "+i+" de la premiere ligne vvp4 :" + tok);
  218.  out.writeDouble(tok);
  219. }
  220. int nbLignes_vvp4 = (num2-3)/3;
  221. System.out.println(nbLignes_vvp4);
  222. for (int i=0; i<nbLignes_vvp4; i++) {
  223.  String lignes_vvp4 = br.readLine();
  224.  StringTokenizer stkk = new StringTokenizer(lignes_vvp4);
  225.  for (int j=0; j<3; j++) {
  226.   double valeurs_vvp4 = Double.parseDouble(stkk.nextToken());
  227.   //System.out.println(valeurs_vvp4);
  228.   out.writeDouble(valeurs_vvp4);
  229.  }
  230. }
  231. br.close();
  232. out.close();
  233. }
  234.     catch (Exception ex) {
  235.       System.exit(0);
  236.     }
  237.   }
  238.   public static void main (String [ ] args){
  239. Creatbin bb = new Creatbin();
  240. bb.parse_vvp0();
  241. //bb.parse_vvp1();
  242. bb.parse_vvp2();
  243. bb.parse_vvp3();
  244. //bb.parse_vvp4();
  245.   }
  246. }


 
Encore merci  :jap:  
++

Reply

Marsh Posté le 19-09-2005 à 22:11:39    

Salut
Probleme réglé.
Si ca t'intéresse: le probleme venait de la ligne 187 de la boucle for

Code :
  1. for (int j=0; j<3; j++) {
  2.             double valeurs_vvp4 = Double.parseDouble(stkk.nextToken());
  3.             System.out.println(valeurs_vvp4);
  4.             out.writeDouble(valeurs_vvp4);
  5.         }


mauvaise implémentation de l'indice j. Il m'arrive d'avoir des lignes avec 2 chiffres ce qui lance une exception....
 
Je vai poster une autre question. A savoir comment faire pour tester le premier caractère d'une chaine de caractere String.
J'ai un chiffre sous la forme d'un string et je veux savoir s'il commence par un signe "-"???
Merci

Reply

Marsh Posté le 20-09-2005 à 09:48:35    

Code :
  1. String s=new String("-1234.1234" );
  2. if(s.charAt(0)=='-'){
  3.    System.out.println("Negatif." );
  4. else{
  5.    System.out.println("Positif." );
  6. }


Ya un outil fabuleux qui s'appelle javadoc, je te conseil vivement son utilisation lorsque tu te pose des questions concernant les fonctionnalités d'une classe ( cf classe String ).

Reply

Sujets relatifs:

Leave a Replay

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