2010-02-03 4 views
3

so i ont le code ci-dessous l'ouverture d'un flux d'entrée et la collecte de l'information avec succès:Comment envoyer un EOF pour un élément Java InputStream?

   httpInput = httpConnection.openInputStream();    

      sb= new StringBuffer();    

      while (ch != -1) 
      { 
       ch = httpInput.read(); 
       sb.append((char)ch); 
      } 

cependant, lorsque je tente d'utiliser la même chaîne (sb.ToString()) dans un autre procédé, i obtenir une erreur indiquant "Expecting fin du fichier.". alors comment attacher un caractère EOF à ma chaîne? REMARQUE: la réponse est essentiellement un document XML provenant d'un serveur distant.

donc lorsque le code atteint la ligne "analyser", il me donne l'erreur ci-dessus: (. Sb.ToString() getBytes())

bis = new ByteArrayInputStream; doc = docBuilder.parse (bis); Je code ceci pour une application blackberry.

ac

Répondre

2

Si vous voulez juste lire le flux dans un tableau d'octets puis essayez d'utiliser IOUtilities.streamToBytes()

+0

cela a fonctionné comme un champion !!!! J'ai aimé comment il a condensé le code à 1 ligne !!! agréable. merci marc !!!! – sexitrainer

2

Le dernier appel de ch = httpInput.read(); vous donne la valeur -1, qui est ensuite ajouté à votre StringBuffer sb. Mais avec ce code read() vous indique qu'il a atteint la fin du flux, ce n'est pas un personnage que vous devez ajouter.

Vous pouvez le faire à la place:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
while (true) 
{ 
    ch = httpInput.read(); 
    if(ch == -1) { 
     break; 
    } 
    out.write(ch); 
} 
String result = out.toString("utf-8"); // or whatever charset is used 

// or if you only need another InputStream: 
ByteArrayInputStream in = new ByteArrayInputStream(out.getBytes()); 
2

Un gros problème avec ce code est que vous semblez être en train de lire un octet à la fois et en supposant chaque octet est un caractère. Ce n'est pas forcément vrai, mais cela fonctionnerait pour un encodage simple comme ASCII. La lecture d'un octet à la fois peut également être très lente. Je ne sais pas qu'il existe un caractère EOF - habituellement "EOF" est la valeur -1 renvoyée par des méthodes comme read(), mais ce n'est pas un caractère.

Quelle est cette autre méthode? quel personnage attend-il exactement - pouvez-vous le découvrir? alors juste ajouter ça? Ce n'est pas clair ce que vous essayez vraiment de faire là-bas. Le message d'erreur "Expecting end of file" dans l'analyseur XML n'a peut-être rien à voir avec le caractère EOF.

+0

Malheureusement, l'API BlackBerry ne me permet pas de lire plus de 1 octet à la fois en utilisant l'objet InputStream de micro-édition. S'il y a un autre objet de flux d'entrée (dans l'API de Blackberry) que je peux utiliser pour lire plus d'un octet à la fois, s'il vous plaît faites le moi savoir pour que je puisse l'utiliser. Merci! – sexitrainer

+2

Il y a une méthode de lecture (octet [] b, int off, int len) dans InputStream –

1

Il peut indiquer un problème de syntaxe XML (peut-être, un analyseur XML a rencontré plusieurs caractères après la fin d'un document XML bien formé)

Questions connexes