He escrito un pequeño programa Java que toma argumentos de la línea de comandos y debería ser interactivo.
Cuando quiero probar con una entrada grande, quiero canalizar el contenido de un archivo a la JVM para usarlo como argumentos de entrada al programa, pero no quiero reemplazar la entrada estándar con el contenido del archivo.
Así que lo intenté
menos archivo | xargs -0 java -cp ... mypackage.ClassName
pero esto reemplaza a stdin con el contenido del archivo, creo que la parte interactiva del programa que usa BufferedReader.readLine () toma su contenido del archivo.
¿Hay alguna manera de que primero pueda canalizar el contenido del archivo a la JVM y luego volver a StdIn?
Estoy corriendo Ubuntu
Ejemplo de código:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String cmd;
while(true) {
try {
System.out.print(">");
cmd = br.readLine(); //becomes null if I start the program as above
PD. Sería mejor para el programa Java trabajar con archivos, pero quiero saber si esto es posible Ds.
java -cp … --other-argument <contents-of-a-file> --another-argument mypackage.ClassName
? ¿Así que puedes analizar la línea de comandos para ese argumento? ¿Tal vez debería darnos un ejemplo de código mínimo de su programa Java? Qué es lo que tú De Verdad necesidad de lograrlo, es decir, qué hay en este archivo y por qué no puede simplemente darle a su programa la ruta del archivo y dejar que eso abra el archivo.java myclass "$(<some-file.txt)"
- pero este es un hack muy malo y debes modificar tu programa Java para tomar un nombre de archivo como argumento.Respuestas:
Primero, el regaño: una de las reglas menos conocidas de la programación de scripts de shell (e incluso el uso de shell interactivo) es no utilice
a menos que tengas una muy buena razón para hacerlo. Oh, claro, funciona, pero es un estilo ineficiente y malo. Y seguro,
es la forma más sencilla de mostrar un archivo en el terminal; esta bien. Y
y
están bien. Pero
(con un solo nombre de archivo en la
cat
línea de comando) casi siempre se puede convertir aY espero que no sea necesario decir eso, si
es malo,
es probablemente peor Porque no lo dices
? Pero eso no resolvería tu problema.
Yo creo eso
La respuesta que estás buscando es:
Esto (o, equivalentemente, --arg-file = expediente ) dice
xargs
abrir expediente , no como entrada estándar , y léalo y procéselo de la manera en que normalmente manejaría la entrada estándar, pero deje la entrada estándar original solo, y haga que esté disponible para el programa ejecutado. Advertencia: no todas las versiones dexargs
apoya estoPor cierto, ¿estás esperando? expediente para ser tan grande que su contenido no pueda caber en una línea de comando, por lo que su programa deberá ejecutarse varias veces, con subconjuntos de expediente como argumentos?
fuente
"$(<some-file.txt)"
probablemente no habría funcionado.