(Erreur exécution) FileInputStream.read / FileOuputStream.write [Résolu]

Signaler
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012
-
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012
-
Bonjour,



lors de l'exécution j'ai l'erreur d'exécution suivante :



java.lang.IndexOutOfBoundsException

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

at java.io.FileInputStream.read(FileInputStream.java:194)

at Client$ClientTraitementDemande.envoi(Client.java:992)

at Client$ClientTraitementDemande.gestion_connexion(Client.java:1127)

at Client$ClientTraitementDemande.run(Client.java:1163)



ma ligne 992 : octetsLus = donneesAEnvoyer.read(piece, offset, taille);

je lis "taille" octets à partir de l'offset "offset" depuis le byte[taille] "piece".

donneesAEnvoyer est un FileInputStream.



cette ligne passe une fois avec offset 0 et taille 524288
(512Ko) -> pas de problème, aucune excpetion
générée

deuxième passage : offset 524288 et taille
524288
-> exception générée,
voir au dessus





c'est exactement la même histoire lorsque je veux écrire :

fichierSortie.write(donnees,offset,taille);

j'écris "taille" octets à partir de l'offset "offset" depuis le byte[] "donnees". (donnees peut contenir plusieurs Mo)

fichierSortie est un FileOutputStream.



cette ligne passe une fois avec offset 0 et taille
524288 -> pas de
problème, aucune excpetion générée

deuxième passage : offset 524288 et taille
524288
-> exception générée, la même que au dessus sauf que c'est écrit
write à la place de read.



Merci pour votre aide

4 réponses

Messages postés
194
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
1 mai 2009
36
Cet exception java.lang.IndexOutOfBoundsException ce produit lorsqu'on écrit en dehors des bornes d'un tableau (par exemple, si ton tableau fait 10 cellules, l'execption est levée si tu écrit a la 11 eme cellule)

octetsLus = donneesAEnvoyer.read(piece, offset, taille);
cette fonction lit taille octets et les places a partir de la celulle offset de ton tableau piece. Est ce que le tableau piece est assez grand pour contenir les infos que tu lis ?! a mon avis non! Ton tableau, d'apres ce que je vois, fait 512 ko donc c'est normal que pour ton premier appel tout se passe bien, mais au deuxieme appel, c'est normal que ça plante car tu place tes valeurs a partir de la cellule 524288 (la fin de ton tableau donc) et donc a la lecture de données, la capacité de ton tableau est dépassée d'où exception.

Je pense que tu n'as pas bien saisie le parametre offset. offset n'est pas la position dans ton fichier (stream) mais la position dans ton tableau où les valeurs lus avec read vont etre placées.Si tu veux toujours lire 512 ko sans que ça plante, laisse toujours offset a 0, ton tableau sera rempli a 512ko a chaque lecture.
octetsLus = donneesAEnvoyer.read(piece, 0, taille);
tu verra ça marchera !!
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012

Salut,
ok merci bcp :) j'avais mal compris ce que faisait la fonction read ! offset est par rapport buffer dans lequel on écrit et non le fichier qu'on lit, si j'ai bien compris ce que tu m'as dit. Je vais essayer de suite, je te tiens au courant. merci :)
a+
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012

Encore quelques petits problèmes mais là j'ai plus le temps, je te tiens au courant.
a+
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012

j'ai modifié et testé, ca marche :)

merci

a+