2010-07-29 6 views
4

J'ai 2 classes qui doivent lire un InputStream, le premier devrait seulement interpréter la première ligne du flux MAIS la première ligne devrait être enlevée du flux de sorte que la classe B peut tout interpréter après la première ligne. Ce qui ne fonctionne pas quand je passe mon InputStream à un BufferedReader et fais un readLine().Lire la première ligne dans un flux et l'enlever du flux

Je sais que je pourrais faire une lecture sur le flux jusqu'à ce que j'ai rencontré un \ b mais peut-être une solution plus appropriée existe pour faire le travail?

// Reads the first line from the stream and everything else 
public String retrieveFileNameFromTheFirstLineInInputStream(InputStream in) throws IOException { 
    InputStreamReader isReader = new InputStreamReader(in); 
    BufferedReader reader = new BufferedReader(isReader); 
    return reader.readLine(); 
} 

Répondre

3

Vous ne pouvez pas supprimer quelque chose d'un InputStream, vous ne pouvez lire de lui. N'utilisez pas le BufferedReader pour lire la ligne, car il lira sûrement beaucoup plus que la première ligne du InputStreamReader (pour remplir son tampon) qui lit lui-même du InputStream.

Je suggère de lire en utilisant le InputStreamReader jusqu'à la fin de la ligne est atteinte, puis passez l'instance InputStream à votre code qui devrait le lire.

BTW, vous devez toujours spécifier le codage utilisé par le InputStreamReader, sinon le codage du système sera utilisé pour convertir les octets du InputStream en caractères qui peuvent différer sur différentes machines.

+0

J'ai édité ma question, il y avait un défaut dans mon test d'unité mais en effet le lecteur lit tout. Quel est l'avantage d'utiliser un InputStreamReader iso le InputStream lui-même? –

+0

Il me semble d'essayer ce code que même InputStreamReader peut tamponner l'entrée, donc passer le InputStream après qu'il ait été utilisé manquera tout ce que le premier InputStreamReader tamponné. – dfrankow

2

Je crois que même InputStreamReader peut mettre en tampon l'entrée, donc la réponse de Mike L peut manquer l'entrée.

C'est bizarre, mais vous pouvez utiliser ReaderInputStream de Apache commons-io. Donc:

BufferedReader reader = new BufferedReader(
    new InputStreamReader(in)); 
String firstLine = reader.readLine(); 
InputStream in2 = new ReaderInputStream(reader); 
// continue with in2 .. 
Questions connexes