IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

écriture progressive dans un fichier


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Par défaut écriture progressive dans un fichier
    Bonjour ,
    je voudrais écrire des blocs d'octets de 18M dans un fichier, pour cela j'utilise les instructions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    FileInputStream in = new FileInputStream(entree);
    	    	  FileOutputStream out = new FileOutputStream(sortie);
    	    	  byte [] Block = new byte[18874368];
    long TailleFichier = (new File(entree)).length();
    	    	  //Nombre de bolcks d'une taille de 18M
    	    	  long NbBlocks = ((new File(entree)).length())/18874368;
    	    	  //Compteur de blocks enregistrés
    	    	  long Compteur = 1;
    	    	  //L'offset d'enregistrement
    	    	  long CompteurBlocks = 0;
    	    	  //La taille d'écriture
    	    	  long avancement = 0;
    	    	  while(in.read(Block) != -1){
                              //calcul de l'Offest
    	    		  CompteurBlocks = (Compteur-1)*18874368;
                              //écriture à partir de l'offest avec un enregistrement "avancement"
    	    		  out.write(Block, (int)CompteurBlocks, (int)avancement);
                              //un bloc de plus écris
    	    		  Compteur++;
                              //vers la fin du fichier
    	    		  if(Compteur == NbBlocks){
    	    			  avancement = TailleFichier - (Compteur*18874368);
    	    			  Block = new byte[(int)avancement];
    	    		  }else{
    		    		  avancement = Block.length;
    	    		  }
    	    	  }
    in.close();
    out.close();
    Mais j'ai un problème juste au commencement de l'écriture du deuxième bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    java.lang.IndexOutOfBoundsException
    	at java.io.FileOutputStream.writeBytes(Native Method)
    	at java.io.FileOutputStream.write(FileOutputStream.java:260)
    Est ce que vous avez idée ?
    Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je ne vois pas ce que tu essaies de faire avec Compteur et CompteurBlock.

    Les paramètres de out.write() devraient toujours être
    - Block
    - 0
    - nombre d'octets lus lors du dernier read().

    Lis la JavaDoc de OutputStream.write(byte[], int, int)

    Et comme je vois que tu ne récupères pas le nombre d'octets lus, je te signales que tu dois le faire. Lis aussi la JavaDoc de InputStream.read(byte[])
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je ne vois pas ce que tu essaies de faire avec Compteur et CompteurBlock.

    Les paramètres de out.write() devraient toujours être
    - Block
    - 0
    - nombre d'octets lus lors du dernier read().

    Lis la JavaDoc de OutputStream.write(byte[], int, int)

    Et comme je vois que tu ne récupères pas le nombre d'octets lus, je te signales que tu dois le faire. Lis aussi la JavaDoc de InputStream.read(byte[])
    j'essayai à travers ces variables de suivre l'enregistrement des blocks, car je croyais que le champ Offset correspondait aux derniers emplacement du pointeur de lecture ... cependant j'ai essayé ce que vous m'avez écrit, il marche uniquement lorsqu'il s'agit d'une copie sans altération ... mais j'ai essayé d'appliquer certaines opérations sur les tableaux de Bytes récupérés successivement pour les enregistrer dans un autre fichier et par la suite effectuer l'opération inverse sur le nouveau fichier pour reconstituer le fichier de départ mais sans succès ...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par t-student Voir le message
    mais j'ai essayé d'appliquer certaines opérations sur les tableaux de Bytes récupérés successivement pour les enregistrer dans un autre fichier et par la suite effectuer l'opération inverse sur le nouveau fichier pour reconstituer le fichier de départ mais sans succès ...
    Je dois pas comprendre ce que tu dis.

    Exemple ? (Simple)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je dois pas comprendre ce que tu dis.

    Exemple ? (Simple)
    j'effectue un cryptage sur les blocs récupérés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    byte[] passwordInBytes = password.getBytes("ISO-8859-2"); 
    	      Key clef = new SecretKeySpec(passwordInBytes, "Blowfish"); 
    	      Cipher cipher = Cipher.getInstance("Blowfish");
    	      cipher.init(Cipher.ENCRYPT_MODE, clef);
    FileInputStream in = new FileInputStream(entree);
    	    	  FileOutputStream out = new FileOutputStream(sortie);
    	    	  byte [] Block = new byte[18874368];
    	    	  while(in.read(Block) != -1){
    	    		  byte[] BlockCrypte = cipher.doFinal(Block);
    	    		  out.write(BlockCrypte, 0, Block.length);
    	    	  }
    	    	  in.close();
    	    	  out.close();
    et lorsque j'effectue l'opération inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    byte[] passwordInBytes = password.getBytes("ISO-8859-2"); 
    Key clef = new SecretKeySpec(passwordInBytes, "Blowfish"); 
    	      Cipher cipher = Cipher.getInstance("Blowfish");
    	      cipher.init(Cipher.DECRYPT_MODE, clef);
    	    	  FileInputStream in = new FileInputStream(entree);
    	    	  FileOutputStream out = new FileOutputStream(sortie);
     byte [] Block = new byte[18874368];
    	    	  while(in.read(Block) != -1){
    	    		  byte[] BlockCrypte = cipher.doFinal(Block);
    	    		  out.write(BlockCrypte, 0, Block.length);
    	    	  }
    	    	  in.close();
    	    	  out.close();
    Il est impossible de reconstituer le fichier de départ !

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je t'ai dit que tu dois garder et utiliser le résultat de in.read(), qui indique combien d'octets ont été lus. Pourquoi tu ne m'as pas écouté ?

    Pour que tu comprennes précisément de quoi il s'agit, je t'ai dit aussi de lire la JavaDoc de in.read(). Pourquoi tu ne l'as pas fait ?

    Tu ne peux pas deviner combien in.read() va lire d'octets. Tu sais qu'il va en lire:
    - soit zéro s'il n'y en a plus à lire, auquel cas il renvoie -1
    - soit entre 1 et tableau.length, s'il reste des choses à lire, auquel cas il renvoie le nombre lus.

    Ton code considère qu'il y a toujours tableau.length octets lus, et insère donc une tripotée d'octets aléatoires en lieu et place des octets qui n'ont pas été lus là où le code pensait qu'ils l'étaient.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème d'écriture String dans un fichier
    Par scary dans le forum Langage
    Réponses: 1
    Dernier message: 03/07/2009, 20h14
  2. écritures concurrentes dans un fichier
    Par qouify dans le forum C
    Réponses: 34
    Dernier message: 01/08/2007, 15h41
  3. [POI] Problème écriture/lecture dans un fichier Excel
    Par steuve dans le forum Documents
    Réponses: 6
    Dernier message: 02/07/2007, 15h47
  4. écriture/lecture dans des fichiers
    Par rafale001 dans le forum C
    Réponses: 14
    Dernier message: 02/03/2007, 16h59
  5. écritures concurrentes dans un fichier
    Par djmalo dans le forum C
    Réponses: 9
    Dernier message: 06/03/2005, 01h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo