2 votes

Le même flux d'entrée peut-il être utilisé par un lecteur de flux ?

J'ai besoin d'effectuer des traitements sur un fichier, en comptant d'abord le nombre de lignes et en le comparant à une valeur.

Le suivant est celui qui lit le fichier ligne par ligne et effectue des validations.

Si la première étape est réussie, je dois seulement effectuer la deuxième étape.

Je lis le même fichier en utilisant le protocole FTP.

Lorsque j'essaie de créer un autre flux d'entrée, ftp est occupé à lire le fichier en cours.

comme ceci :

(is1 = ftp.getFile(feedFileName);)

ci-dessous est le reste :

 InputStream is = null;
LineNumberReader lin = null;
    LineNumberReader lin1 = null;
is = ftp.getFile(feedFileName);  
lin = new LineNumberReader(new InputStreamReader(is));

Je peux donc utiliser la méthode ci-dessous :

 is1=is;

Les deux flux contiendront-ils le contenu du fichier du début à la fin ou le deuxième objet deviendra nul dès que le premier objet de flux sera lu.

La seule option qui reste est donc de créer un nouvel objet ftp pour lire un flux séparément ?

4voto

Elchin Points 397

C'est possible, mais vous devrez "rembobiner" l'InputStream. Il faut d'abord appeler la méthode mark(), puis réinitialiser. Voici la documentation : http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#reset ()

2voto

Hiery Nomus Points 4157

Une fois que vous avez terminé avec le LineNumberReader, fermez l'InputStream is . Ensuite, redemandez le fichier au FTP, il ne sera plus occupé à ce moment-là. Vous ne pouvez pas "simplement" lire à partir du même InputStream, car celui-ci est probablement épuisé lorsque le LineNumberReader a terminé. De plus, tous les InputStreams ne supportent pas la fonction mark() y reset() des méthodes.

Toutefois, je pense qu'il n'est peut-être pas judicieux de ne lancer le deuxième processus que lorsque le premier a abouti. Puisque vous diffusez les données de toute façon, pourquoi ne pas les diffuser dans une structure de données temporaire, puis compter les lignes et opérer ensuite sur la même structure de données.

1voto

andy Points 1102

Si votre fichier n'est pas volumineux, vous pouvez enregistrer les données dans une chaîne de caractères. lier :

StringBuilder sb = new StringBuilder();
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer))!=-1)
sb.append(buffer, 0, len);
String data = sb.toString();

vous pouvez alors faire d'autres choses dans la chaîne de caractères comme :

int lineNumber = data.split("\n").length;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X