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

Android Discussion :

Conversion InputStream en String


Sujet :

Android

  1. #1
    Membre confirmé
    Homme Profil pro
    Software Engineer
    Inscrit en
    Février 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 139
    Par défaut Conversion InputStream en String
    Bonjour,

    Je cherche a convertir, comme le dit le titre, un InputStream en String, la conversion n'as pas l'air de poser problème mais rien en s'affiche dans mon edittext :

    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
    	class Looper extends BaseIOIOLooper implements OnClickListener {
     
    		@Override
    		public void setup() throws ConnectionLostException {
                uart = ioio_.openUart(7,13,115200,Uart.Parity.NONE,Uart.StopBits.ONE);
                in = uart.getInputStream();
                out = uart.getOutputStream();
                button_.setOnClickListener(this);
    		}
     
    		public void loop() throws ConnectionLostException, InterruptedException {
     
    				try {
    					in.read();
    					messagein= convertStreamToString(in);
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
     
    				textin.setText(messagein.toString());
    			Thread.sleep(10);
    		}
     
    		@Override
    		public void onClick(View v) {
    			// TODO Auto-generated method stub
    			if(v==button_){
    				sending();
    			}
    		}
     
    		public String convertStreamToString(InputStream is) throws IOException{
    			byte[] buffer = new byte[1024];
    			String result;
    			StringBuffer sb = new StringBuffer();
    			int readIn=0;
     
    			while((readIn = is.read(buffer)) > 0){
    				String temp = new String(buffer, 0, readIn);
    				sb.append(temp);
    			}
     
    			result = sb.toString();
     
    			return result;
    		}
    	}
    Avez-vous une idée ?

    Merci pas avance.

  2. #2
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Salut,
    Ceci devrait marcher

    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
     
    final StringBuilder out = new StringBuilder(); 
     
    // Buffer de lecture
    final byte[] buffer = new byte[bufSize]; 
     
    try {
    	// On ajoute le contenu du flux au StringBuilder
    	for (int ctr; (ctr = in.read(buffer)) != -1;) {
    	     out.append(new String(buffer, 0, ctr));
    	 }
    } catch (IOException e) {
    	  throw new RuntimeException("Ca marche pas !!", e);
    }
     
     // On retourne la chaîne contenant les données de l'InputStream
     return out.toString(); 
    }

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Il faudrait déjà savoir en quel charset est l'InputStream.... on ne décode pas de l'UTF-8 comme de l'UTF-16

  4. #4
    Membre confirmé
    Homme Profil pro
    Software Engineer
    Inscrit en
    Février 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 139
    Par défaut
    J'avouerais que je ne sais pas, c'est un InputStream provenant d'une liaison série, je suppose que c'est de l'UTF-8.

  5. #5
    Membre confirmé
    Homme Profil pro
    Software Engineer
    Inscrit en
    Février 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 139
    Par défaut
    Bonjour,

    Le code fourni par Nico02 ne fonctionne pas auriez-vous une autre solution ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Marche forcément pas... il lit des octets... (sans doute mappés vers des caractères single-byte), et les passe à une String (qui les considère comme des caractère double-byte)....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    InputStream is; // entrée...
     
    StringBuilder out = new StringBuilder();
    int c;
    InputStreamReader reader = new InputStreamReader(is,"UTF-8"); // choisir le charset ici
    while ((c = reader.read()) != -1) 
        out.append(c);
    reader.close();
    return out.toString();
    Autre option (avec un "buffer"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    InputStream is; // entrée...
     
    StringBuilder out = new StringBuilder();
    char[] buffer = new char[BUFFER_SIZE];
    InputStreamReader reader = new InputStreamReader(is,"UTF-8"); // choisir le charset ici
    int l;
    while ((l = reader.read(buffer,0,BUFFER_SIZE)) != -1) 
        out.append(buffer,0,l);
    reader.close();
    return out.toString();

  7. #7
    Membre confirmé
    Homme Profil pro
    Software Engineer
    Inscrit en
    Février 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 139
    Par défaut
    Bonjour,

    Merci de la réponse, voici mon code qui ne fonctionne toujours pas, la seule chose que je vois c'est que ce n'est pas UTF-8, comment puis-je savoir si c'est ca ou pas ?

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    public class MainActivity extends IOIOActivity {
     
    			Uart uart;
    			InputStream in;
    	        OutputStream out;
    	        Button button_;
    	        EditText textout;
    	        TextView textin;
    	        String messageout = "";
    			String messagein ="";
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		button_ = (Button) findViewById(R.id.send);
    		textout = (EditText) findViewById(R.id.textout);
    		textin = (TextView) findViewById(R.id.textin);
     
    	}
     
    	class Looper extends BaseIOIOLooper implements OnClickListener {
     
    		@Override
    		public void setup() throws ConnectionLostException {
                uart = ioio_.openUart(39,40,115200,Uart.Parity.NONE,Uart.StopBits.ONE);
                in = uart.getInputStream();
                out = uart.getOutputStream();
                button_.setOnClickListener(this);
     
     
    		}
     
    		public void loop() throws ConnectionLostException, InterruptedException{
     
    			try {
    				String rx = Rx();
    				textin.setText(rx);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			Thread.sleep(10);
     
    		}
     
    		@Override
    		public void onClick(View v) {
    			// TODO Auto-generated method stub
    			if(v==button_){
    				Tx();
    			}
    		}
     
    	}
     
    	@Override
    	protected IOIOLooper createIOIOLooper() {
    		return new Looper();
    	}
     
     
    	private void Tx() {
    		runOnUiThread(new Runnable() {
    			@Override
    			public void run()  {
     
    				try {
    					messageout = textout.getText().toString();
    					out.write(messageout.getBytes());
    	                out.flush();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		});
    	}
     
     
    	private String Rx() throws IOException{
     
    		StringBuilder out = new StringBuilder();
    		char [] buffer = new char[30];
    		InputStreamReader reader = new InputStreamReader (in,"UTF-8");
    		int l;
    		while((l=reader.read(buffer,0,30)) != -1){
    			out.append(buffer,0,1);
    		}
    		reader.close();
     
    		return out.toString();
    	}
     
    }
    Merci

  8. #8
    Membre confirmé
    Homme Profil pro
    Software Engineer
    Inscrit en
    Février 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 139
    Par défaut
    Dans mon xml, j'ai bien le UTF-8, et la transmission de l'appli vers l'hyperterminal se passe bien, donc le problème ne viendrais pas de la.

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    J'avoue que je suis paumé dans le code filé....

    Un "looper" ? Chez moi un looper est un bout de code qui va gérer des messages... et dans la "loop" traduire ces messages en appels "framework" fonctionnels.

    Là je ne vois pas du tout l'interêt d'un looper. A moins que le nom soit ici galvaudé ^^


    Sinon... je vois un appel à Tx() dans un onClick() [au passage attention, fonction java = lower-case first letter].

    Je pense que le but est plutot un truc dans ce genre:
    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
     
    class IOTask extends AsyncTask<String,Void,String>()
    {
     
         // je pense que les streams in/out devraient être acquis ici, mais bon...
         @Override
         protected String doInBackground(String... params)
         {
                try {
                    uart = ioio_.openUart(39,40,115200,Uart.Parity.NONE,Uart.StopBits.ONE);
                    in = uart.getInputStream();
                    out = uart.getOutputStream();
     
                    out.write(params[0].getBytes("UTF-8")); // là encore on envoit en UTF-8 ?
                    out.flush();
                    return convertStreamToString(in);
                } catch (Exception ex) {
                    Log.e("IOTask","Failed to communicate",ex);
                    return "Error !";
                } finally {
                    if (in != null) in.close();
                    if (out != null) out.close();
                }
         }
     
         @Override
         protected void onPostExecute(String result)
         {
              textout.setText(result);
         }
    }
    Et dans le code de l'activité:
    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
     
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
             // ... ce qui était avant sauf uart/in/out
             button.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
                     onTransmitReceive();
                 }
              });
         }
     
         public void onTransmitReceive() {
              IOTask  task = new IOTask();
              task.execute(textout.getText().toString());
         }
    Pas besoin de looper, de thread, de handler, de "runOnUiThread", etc...

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par katze Voir le message
    Bonjour,

    Merci de la réponse, voici mon code qui ne fonctionne toujours pas, la seule chose que je vois c'est que ce n'est pas UTF-8, comment puis-je savoir si c'est ca ou pas ?
    Te bille pas, si c'était pas compatible UTF-8, tu aurais récupéré une Exception ou des ? dans le stream. Pas "rien".

    Citation Envoyé par nicroman Voir le message
    Un "looper" ? Chez moi un looper est un bout de code qui va gérer des messages... et dans la "loop" traduire ces messages en appels "framework" fonctionnels.
    Du tout, un looper, c'est un gars qu'on envoie dans le passé pour tuer des gens du futur.

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Du tout, un looper, c'est un gars qu'on envoie dans le passé pour tuer des gens du futur.
    Bravo ! Ta boucle est bouclée

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    NooooooooooooooooN

  13. #13
    Membre confirmé
    Homme Profil pro
    Software Engineer
    Inscrit en
    Février 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 139
    Par défaut
    Ok merci je vais tester ton code nicroman, le code est basé sur un exemple fourni avec la carte électronique qui me permet de faire la liaison série donc j'ai adapté par rapport à ce qui existait.

    EDIT :

    Je ne comprend pas ton code, comment tu peu faire appel à textout dans IOTask ? Et convertStreamToString du coup ca serais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    StringBuilder out = new StringBuilder();
    		char [] buffer = new char[30];
    		InputStreamReader reader = new InputStreamReader (in,"UTF-8");
    		int l;
    		while((l=reader.read(buffer,0,30)) != -1){
    			out.append(buffer,0,1);
    		}
    		reader.close();
     
    		return out.toString();

Discussions similaires

  1. conversion inputstream string
    Par Adren dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 31/01/2007, 10h52
  2. Conversion d'un string en hexa
    Par marsupilami34 dans le forum Langage
    Réponses: 3
    Dernier message: 07/07/2005, 09h13
  3. [Débutant] Conversion d'un String en Int
    Par chleuh dans le forum Langage
    Réponses: 9
    Dernier message: 30/12/2004, 13h33
  4. [C#] Conversion d'un string en byte[] et inversement
    Par david71 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2004, 15h10
  5. Réponses: 2
    Dernier message: 21/06/2004, 15h55

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