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 :

[Réseau] BufferedReader et curseur de InputStream


Sujet :

Entrée/Sortie Java

  1. #1
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut [Réseau] BufferedReader et curseur de InputStream
    Bonjour,

    Lors d'un échange réseau, je recois un message (côté java). Il y a une partie en texte (j'utilise donc le BufferedReader) puis une image écrite en dur. J'aimerais réutiliser directement mon InputStream au moment de la lecture de l'image (car je tiens à avoir directement des bytes).

    Le seul problème, c'est que j'ai l'impression que le BufferedReader n'a jamais fait avancer le curseur de l'InputStream. Ce qui fait que mon image a un décalage étant donné que je recommence à lire des parties de texte avec l'InputStream.

    Est-ce que vous savez comment obliger le BufferedReader à faire avancer le curseur de l'InputStream à chaque appel de la méthode readLine ?

    Sinon, j'ai bien essayer d'utiliser la méthode read de BufferedReader qui lui utilise des char[]. Mais la conversion char -> byte ne s'est jamais bien fait.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je pense que tu dois envoyer plusieurs données et que tu est déjà à la suivante et que le BufferedReader a "lu" ton image. En effet les Buffered(Reader et InputStream) utilisent un buffer de 8192 éléments qui sont lu d'un bloc pour éviter de trop multiple accès I/O...


    Pour t'aider il faudrait connaitre un peu la structure des message que tu envois, mais perso j'utiliserais plutôt BufferedInputStream et j'utiliserais le constructeur String(byte[],charset) pour récupérer la chaine de caractère...

    a++

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Grosso modo, la partie Java recoit quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MIPP/1.0 100 OK
    Server: TEST
    Response:
    ImageType: RGBSHORT
    ImageWidth: 1200
    ImageHeight: 1844
    ...
    Au niveau des trois petits point, cela va être une liste de byte (3*1200*1844 bytes, *3 à cause des 3 couleurs).

    Donc, si le byte vaut -128, cela correspond au noir et si le byte vaut 127, cela correspond au blanc.

    Grosso modo, au début, je fais pas mal de readLine jusqu'à ImageHeight. Et à ce moment, j'entame la lecture de tout le bloc :
    Donc, en utilisant un code du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int totalSize = iwidth * iheight *3;
    byte[] b = new byte[totalSize];
    int received = 0;
    int toReceive = totalSize;
    int totalReceived = 0;
     
     
    while(toReceive>0 && received!=-1) {
    	received = stream.read(b, totalReceived, toReceive);
    	toReceive -= received;
    	totalReceived += received;
    }
    Et du coup, j'obtiens quelque chose du genre :



    Effectivement, le coup du readLine qui lit plus que ce qui était prévu. Je n'y avais pas pensé Et ça expliquerait le problème.
    En fait, la seule solution, ce serait d'utiliser le read du BufferedReader et de transformer mes char en byte.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par millie Voir le message
    En fait, la seule solution, ce serait d'utiliser le read du BufferedReader et de transformer mes char en byte.
    Non plutôt l'inverse...

    Étant donné que le "code" de l'image doit surement correspondre à des caractères invalides et que certain caractères spéciaux peuvent être représentés de différentes manières, il y a de forte chance que tu ne retrouves pas exactement tes bytes ce qui dégraderait l'image

    Donc ce serait plus simple de faire l'inverse : utiliser un BufferedInputStream et lire des bytes, et se coder une méthode readLine() qui lirait une ligne depuis un InputStream, par exemple :
    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
    	public static String readLine(InputStream is, String charsetName) throws IOException {
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    		int b;
     
    		// On lit l'input caractère par caractère (pour ne pas empiéter sur l'image)
    		// ==> Du coup il est préférable que ce soit un BufferedInputStream
    		while ( (b=is.read()) >= 0) {
    			baos.write(b);
    			// Et on arrête lorsqu'on trouve un retour à la ligne :
    			if (b=='\n') {
    				break;
    			}
    		}
    		return new String(baos.toString(charsetName));
    	}
    On se retrouve au bon index et on peut lire la suite directement en byte




    Sinon si tu veux vraiment manipuler des caractères il faut alors encoder tes données binaires en Base 64...

    a++

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Alors, merci,. Ca marche bien.

    maître du java

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

Discussions similaires

  1. Redimensionnement des Paquets IP sur un Réseau Local
    Par Bonoboo dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 15h40
  2. Masquer le curseur en mode MS-DOS
    Par Alex120 dans le forum C
    Réponses: 2
    Dernier message: 10/07/2002, 09h30
  3. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09
  4. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54
  5. Position du curseur dans Edit
    Par MrJéjé dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 17h09

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