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

Java ME Discussion :

probleme de stockage de données avec un ByteArrayOutputStream


Sujet :

Java ME

  1. #1
    Membre à l'essai
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 17
    Points
    17
    Par défaut probleme de stockage de données avec un ByteArrayOutputStream
    Bonjour tout le monde. J'ai un probleme assez bizarre.
    Pour faire simple , je me connecte à un serveur, via un telephone portable, qui doit m'envoyer des images. Je les lis par blocs (peut pas faire autrement), pour stocker les tableaux de bytes lus, j'utilise un ByteArrayOutputStream, le probleme c'est qu'il me cause des erreures. Pas d'exception ou ce genre de chose, mais les données sont mal stockées, ou deplacées, qui sait.
    Je precise que je n'ai aucun pouvoir de modifications sur le serveur, il est ecrit en C, mon code :
    je precise que je ne met le code que du thread qui lit les données du serveur, le thread d'ecriture, et de lancement d'application n'ont aucun interet ici, et je ne met que le code de lecture et de verification des données
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    InputStream in_stream;  
    //lecturre des données, et stockage dans un ByteArrayOutputStream
         public int ReadData(ByteArrayOutputStream bytearray,int sizeData)
        {
        	//declarations des variables locales
     
        	//nombre d'octets restant à lire
        	int remaingbytes = sizeData;
        	//nombre d'octets lus à la derniere lecture
        	int read = 0;
        	//si il y a une erreur
        	boolean arret = false;
        	//tableau intermediaire
        	byte[] data = new byte[sizeData];
     
        	byte[] tabData = new byte[sizeData];
        	//nombres courant d'octets lus
            int totalread = 0;
            try{
            	//tant qu'il reste des octets à lire
            	while(remaingbytes > 0)
    	         {
            		//on essaye de lire le plus grand nombre à la fois
    	             read = in_stream.read(data, 0, remaingbytes);
    	             //il y a une erreur, ou on arrive en fin de lecture prematurement
    	             if (read == -1)
    	             {
    	                 arret = true;
    	                 break;
    	             }
    	             //on insere le bloc qui vient d'etre lu dans le buffer de sortie
    	             else{
    	            	 bytearray.write(data,totalread , read); 
     
    	            	 for(int ind = 0;ind<read;ind++ )
    	            		 tabData[ind + totalread] = data[ind];
    	             }
     
    	             //on calcul le nombre d'octets restant à lire, selon les octects qui viennent 
    	             //d'etre recupérés
    	             remaingbytes = remaingbytes - read;
    	             //on ajoute à la taille totale
    	             totalread += read;
    	         }
            	data = null;
    //verification des données
    if(VerifyData(bytearray,sizeData))
    	addDebug("Verify2 OK !!!!", null,5);
    else
    	addDebug("Verify2 KO ####", null,5);
    	         if (arret || read == -1 || totalread != sizeData)
    	         {
    	        	 //addDebug("    Error "+  remaingbytes +"/" +totalread, null,2);
    	         }
             }
            catch(IOException e)
            {
            	System.out.println("    IOException "+  remaingbytes +"/" +totalread);
            }catch(NullPointerException e)
            {
            	System.out.println("    NPException"+  remaingbytes +"/" +totalread);
            }
             //on renvoie la taille du bloc lu
             return sizeData;
        }
     
    //verification des données 
    public boolean VerifyData(ByteArrayOutputStream bytearray,int sizeData)
        {
        	byte[] tabData =bytearray.toByteArray();
        	byte compt = 0;
        	for(int ind = 0 ; ind < sizeData ; ind ++)
        	{
        		if(compt >= 255)
        			compt = 0;
        		if(tabData[ind] != compt)
        		{
        			addDebug("-Byte ind "+ind+":"+(new Byte(compt)).toString() 
        					+ "/"+(new Byte(tabData[ind])).toString(), null, 4);
        			return false;
        		}
        		compt ++;
        	}
        	return true;
        }
    pour verifier les données, c'est tout bete, le serveur m'envoie un tableau de byte {0,1,2....,253,254,255,0,1,2...255,0......}, donc suffit de faire une boucle for

    Merci de votre aide

  2. #2
    Membre à l'essai
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Je sais que ca vient du ByteArrayOutputStream, car j'ai testé en n'utilisant qu'une tableau de byte (byte[]), et ca passe à chaque fois, aussi bien sur emulateur que sur telephone.
    Mais comme sur mon autre appli les images n'ont pas toutes la meme taille, je me retrouve à reallouer un tableau de byte à chaque image, et c'est monstrueux, et ca fait planté mon appli à force.

  3. #3
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    J'ai pas decrypter tout ton code mais pour recuperer le contenu de ton ByteArrayOutputStream tu peux utiliser la methode toByteArray() qui te retourne un tableau de byte et dans ce cas si la taille de cetableau est differente de ton parametre sizeData c est peut etre un probleme non ?

  4. #4
    Membre à l'essai
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par willoi
    J'ai pas decrypter tout ton code mais pour recuperer le contenu de ton ByteArrayOutputStream tu peux utiliser la methode toByteArray() qui te retourne un tableau de byte et dans ce cas si la taille de cetableau est differente de ton parametre sizeData c est peut etre un probleme non ?
    la fonction toByteArray justement pour obtenir mon tableau de byte, et ca vient pas de la taille, parceque j'avais meme fais des tests en mettant un prefixe et un suffixe à mon tableau de données sans resultat
    pour pimenter le truc, je reviens de faire le teste, sur emulateur ca passe nickel, et sur telephone ca plante à l'indice qui est apres le premier segment de mon tableau.
    Je me dis que mon algo est pourrave pour pouvoir reconstituer mon tableau :
    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
     
    -lecture du maximum d'octets dans le flux
    -si le nombre d'octets lu est inferieur à la taille de mon bloc, je lis la difference
    en retournant à l'etape precedente
     
                      while(remaingbytes > 0)
    	         {
    	             read = in_stream.read(data, 0, remaingbytes);
    	             if (read >0)
    	             {
    	            	 bytearray.write(data,totalread , read); 
                         }
     
                         remaingbytes = remaingbytes - read;
    	             //on ajoute à la taille totale
    	             totalread += read;
                      }
    je dois avoir un decalage quelque part mais je vois pas

  5. #5
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Il faudrait pas plutot ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bytearray.write(data,totalread + 1, read);
    parce que sinon il reecrit le bloc suivant sur le dernier octet du bloc precedent.

  6. #6
    Membre à l'essai
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par willoi
    Il faudrait pas plutot ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bytearray.write(data,totalread + 1, read);
    parce que sinon il reecrit le bloc suivant sur le dernier octet du bloc precedent.
    c'est pas ca
    totalread sert à stocker le nombre de bytes lus, mais aussi d'offset, pour une taille de segment de 1024 pour un bloc de 3072 on aurait à chaque boucle :
    1/ totalread = 0
    2/totalread = 1024
    3/totalread = 2048
    4/totalread = 3072

  7. #7
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Bon ok.

    Par contre quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read = in_stream.read(data, 0, remaingbytes);
    c est a se demander si la methode read ne retourne pas -1 a certain moment .

    T as pas moyen de tracer le nombre de byte lus a chaque boucle ?

  8. #8
    Membre à l'essai
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par willoi
    Bon ok.

    Par contre quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read = in_stream.read(data, 0, remaingbytes);
    c est a se demander si la methode read ne retourne pas -1 a certain moment .

    T as pas moyen de tracer le nombre de byte lus a chaque boucle ?
    si, c'est jsutement ce qu'elle retourne et qui est stocké dans "read"

    j'ai trouvé en fait mon totalread ne doit pas me servir pour le stockage
    mon erreur est dans le write :
    bytearray.write(data,0, read);

    je n'avais pas compris que le second parametre est l'offset dans la variable "data",

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] probleme de renvoi de donnée avec post ou session
    Par darkterreur dans le forum Langage
    Réponses: 5
    Dernier message: 08/10/2009, 13h12
  2. Réponses: 7
    Dernier message: 22/05/2006, 14h44
  3. Réponses: 4
    Dernier message: 09/05/2006, 08h55
  4. Réponses: 7
    Dernier message: 16/01/2006, 09h23
  5. Réponses: 4
    Dernier message: 02/06/2005, 13h08

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