2010-11-30 36 views
-3

Je suis en train de lire un fichier avec Scanner + System.in. Ma commande sous Linux ressemble:Scanneur + System.in condition d'arrêt

cat -A test.txt | java -jar test.jar 

Je lis comme entrée:

Scanner input = new Scanner(System.in); 

    while (input.hasNextLine()) 
    { 
     String log_line = input.nextLine(); 
    } 

La question est .. Comment puis-je arrêter de lire lorsque vous avez atteint la fin du fichier?

+0

Vous ne savez pas comment cela peut être marqué un doublon d'une question posée quatre ans après que celui-ci a été posté. –

+1

@MeghanArmes L'heure n'a pas d'importance pour la fermeture d'un doublon. Nous préférons que le meilleur poste soit la cible. –

+0

@Jarrod fermant une question comme doublon de question fermée n'est pas une bonne idée, en général. Cela empêche tout moyen d'obtenir de nouvelles réponses. Veuillez rouvrir. –

Répondre

2

Il semble que problème est -A option pas votre code java (il fonctionne correctement sur les fichiers simples):

$ echo -e "foo\nbar" | java -jar Test.jar 
foo 
bar 
$ 

Peut-être test.txt contient des caractères non-imprimables qui ne peuvent pas scanner handle ...

+0

test.txt est un fichier généré par un autre programme et tous les caractères ont l'air bien. Que voulez-vous dire par écho? Echo n'affiche pas le contenu du fichier? Auparavant j'utilisais la commande de queue et le probalem il y a avec la condition pour arrêter .. Je le pense .. – Serhiy

+0

J'ai employé l'écho juste pour la convenance; cela ne fait pas beaucoup de différence (et oui, quelque chose comme 'echo -e" 1 \ n2 \ n3 "> test.txt | tail -n 2 test.txt | java -jar dist/Test.jar Soit dit en passant, quel émulateur de terminal utilisez-vous? –

+0

Omg, je dois être vraiment stupide ou vraiment fatigué .. Un autre thread que je n'ai pas arrêté de sorte que le programme ne va pas quitter.Tanks beaucoup pour l'aide. – Serhiy

3

Le problème est que System.in ne se termine jamais, c'est à dire EOF n'est jamais envoyé au flux, donc hasNextLine() après que la dernière ligne bloque l'attente de plus de données.

La solution consiste à transmettre le nom de fichier à votre application, que vous ouvrez FileInputStream(filePath) et l'utiliser dans le constructeur du scanner.

+0

étrangement, mais cela fonctionne pour moi (il suffit de copier/coller le code de Serhiy et ajouté la ligne faisant écho à stdout) :) –

+0

Myabe il ya une alternative à Scanner? Je ne voulais pas passer fileneame à travers args .. – Serhiy

+0

Je ne discute pas Votre solution (c'est mieux/plus sûr), juste curieux: http://img13.imageshack.us/img13/3706/scanner.png –