2012-03-13 5 views
12

Sto sviluppando un'applicazione con Netbeans e Maven. La mia applicazione dovrebbe ottenere dati da stdin. Ma non riuscivo a capire come testarlo. Mettere < data.txt nella lista di args non funziona.C'è un modo per reindirizzare l'input da file a stdin in Netbeans?

ho bisogno lo stesso di:

$ java MyProgram < data.txt 
+0

Perché si usa lo stdin come input e non semplicemente un paramenter che accede a un file? – khmarbaise

+0

@khmarbaise È più veloce scrivere/leggere da processo padre a figlio anziché: apri file/scrivi su file/chiudi file/avvia processo/apri file/leggi da file/chiudi file. Con il mio scenario non dipende dalle prestazioni del filesystem e posso leggere dallo stream mentre il processo genitore sta scrivendo su di esso ... – denys

risposta

6

Questo può essere fatto aggiungendo il proprio obiettivo di esecuzione al file build.xml del progetto. Per esempio:

<target name="run" depends="jar"> 
    <exec dir="${work.dir}" executable="java" input="${work.dir}/inputfile.txt"> 
    <arg value="-jar"/> 
    <arg file="${dist.jar}"/> 
    </exec> 
</target> 

Nota che comanda come Run, il debug e test usare solo il tuo build.xml personalizzato se la compilazione su Save funzione è disattivata per il progetto. Quindi è necessario assicurarsi che Compile on Save sia disattivato nelle proprietà del progetto.

+0

Mi chiedo perché 'Compile on Save' deve essere disattivato per ottenere questo funziona? –

10

Presumo che hanno una cosa del genere:

public static void main(String[] args) { 
... 
} 

Questo può utilizzato come punto di ingresso per l'applicazione e prima che si cambia il canale di ingresso via:

FileInputStream is = new FileInputStream(new File("test.data")); 
System.setIn(is); 

Quanto sopra può essere utilizzato all'interno di un test di unità/integrazione.

+0

Questo è molto conveniente rispetto alla soluzione @ZeroTau –

+0

Ma cambierà la funzione del codice che temo - cioè il programma risultato durante l'esecuzione leggerà l'input dal file 'test.data' invece del flusso di input standard. –

1

Non sono sicuro di come sia in NetBeans ma in Eclipse è possibile scrivere qualcosa su console e viene reindirizzato come STDIN all'applicazione in esecuzione. Credo che lo stesso dovrebbe funzionare anche in NetBeans. Quindi, avvia la tua applicazione, quindi copia/incolla il contenuto di data.txt in console e probabilmente premi <ENTER>.

Se non aiuto utilizzare il debug remoto, cioè eseguire il programma dal prompt dei comandi come segue:

java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y MyProgram < data.txt

poi collegarsi a questo processo da NetBeans.

+0

tu sei quello che ha capito la mia domanda. Ma sfortunatamente tale stringa di shell non funziona in Netbeans :( – denys

1

Vecchia scuola, ma è quello che sapevo. Un avvertimento è che il comando mvn non ritorna al cli una volta terminato, ma per alcuni scopi questo è accettabile. Nota che è necessario essere nella directory root del progetto

mvn "-Dexec.args = -classpath% classpath com.mycompany.test" -Dexec.executable =/Download/jdk1.7/bin/java exec-maven- plugin: 1.2.1: exec </tmp/Input

0

Aggiungere un nuovo target "run-input" in File-> build.xml con il testo seguente. Nota: questa versione utilizza la posizione corretta del runtime java. Inoltre, presuppone che tu abbia creato una directory chiamata input con il file input1.

<target name="run-input" depends="jar"> 
    <exec dir="${work.dir}" executable="${java.home}/bin/java" input="${src.dir}/inputs/input1"> 
    <arg value="-jar"/> 
    <arg file="${dist.jar}"/> 
    </exec> 
</target> 

È sempre possibile creare una scorciatoia per questo nuovo obiettivo.

Problemi correlati