(Erreur exécution) FileInputStream.read / FileOuputStream.write

Résolu
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012 - 20 mars 2006 à 01:54
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012 - 20 mars 2006 à 15:17
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

tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
20 mars 2006 à 08:07
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 !!
3
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
20 mars 2006 à 08:32
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+
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
20 mars 2006 à 08:52
Encore quelques petits problèmes mais là j'ai plus le temps, je te tiens au courant.
a+
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
20 mars 2006 à 15:17
j'ai modifié et testé, ca marche :)

merci

a+
0
Rejoignez-nous