Input pipe della riga di comando in Java
-
07-07-2019 - |
Domanda
Ecco un semplice pezzo di codice:
import java.io.*;
public class Read {
public static void main(String[] args) {
BufferedReader f = new BufferedReader(new InputStreamReader(System.in));
while(true)
{
String x = null;
try{
x = f.readLine();
}
catch (IOException e) {e.printStackTrace();}
System.out.println(x);
}
}
}
Lo eseguo come: java Leggi < input.txt
Una volta che input.txt è stato completamente reindirizzato nel programma, x continua a ricevere infiniti null. Perchè è così? Esiste un modo per rendere attivo lo Standard In (riga di comando) dopo che il file viene inserito nel codice? Ho provato a chiudere il flusso e riaprirlo, non funziona. Ripristina anche ecc.
Soluzione
Eseguendo "java Read < input.txt"
hai detto al sistema operativo che per questo processo, il file in pipe è standard. Non puoi quindi tornare alla riga di comando dall'interno dell'applicazione.
Se vuoi farlo, passa input.txt come parametro del nome file all'applicazione, apri / leggi / chiudi il file dall'interno dell'applicazione, quindi leggi l'input standard per ottenere cose dalla riga di comando.
Altri suggerimenti
Bene, questo è tipico per la lettura in BufferedReader
. readLine()
restituisce null
quando viene raggiunta la fine dello stream. Forse il tuo ciclo infinito è il problema ;-)
// try / catch ommitted
String x = null;
while( (x = f.readLine()) != null )
{
System.out.println(x);
}
Devi terminare il tuo ciclo while quando la linea è nulla, in questo modo:
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
catch (IOException e) {
logger.error("IOException reading System.in", e);
throw e;
}
finally {
if (in != null) {
in.close();
}
}
Esiste un modo in cui posso fare lo Standard In (riga di comando) attivo dopo che il file inserito nel codice è terminato?
Mi dispiace rispondere a una vecchia domanda, ma nessuna delle risposte finora indica che è un modo (solo shell) per tornare all'input della console dopo aver eseguito il piping in un file.
Se si esegue il comando
{ cat input.txt & cat; } | java Read
quindi il testo da input.txt
verrà passato a java Read
e verrai quindi reindirizzato all'input della console.
Nota che se poi premi Ctrl + D , otterrai il ciclo infinito di null
s, a meno che tu non modifichi il tuo programma per terminare il ciclo quando riceve null.