java - Eclipse leyendo stdin(System.in) desde un archivo
file (11)
¿Es posible que Eclipse lea stdin de un archivo?
Actualización 2015
¡Hay una nueva versión de Eclipse, Eclipse 4.5 (Mars) que ha solucionado bugs.eclipse.org/bugs/show_bug.cgi?id=155411 !
Este es el anuncio y la descripción de la función: http://eclipse.org/mars/noteworthy/#_assigning_stdin_to_a_file
Stdin ahora se puede asignar a un archivo en la pestaña Común de los diálogos de configuración de inicio.
Como era de esperar, esta es una nueva característica del recién lanzado eclipse 4.5 y, por lo tanto, no funcionará en una versión anterior.
Pure Java
Puede redirigir System.in con una sola línea de código:
System.setIn(new FileInputStream(filename));
Ver System.setIn() .
Configuración de Eclipse
En Eclipse 4.5 o posterior, el diálogo de configuración de inicio puede configurar System.in para leer desde un archivo. Vea el anuncio aquí .
En la pestaña "común" del cuadro de diálogo Ejecutar, en "Entrada y salida estándar" hay una casilla de verificación para "archivo". pero parece ser solo para salida ...
Esperaría ver 2 campos de archivos allí, uno para estándar, uno para estándar con las opciones de agregar.
La solución para mí (ejecutándose en una Mac, usando Eclipse CDT para una aplicación C) era agregar "<ruta / a / algún archivo" al final de otros argumentos en la pestaña "Argumentos" del cuadro de diálogo "Ejecutar configuración".
También consulte esta otra pregunta para obtener una respuesta que involucre el lanzamiento de un programa Java en estado suspendido y luego adjuntar el depurador usando Eclipse.
Lo que hice fue crear un objetivo Ant y ejecutarlo como "Ejecutar Externo" desde Eclipse, estos son los pasos:
- Tengo un archivo de entrada para leer desde:
res/in.txt
y uno para la salida:res/out.txt
Cree un
build.xml
con los objetivos que necesita (esto es solo un ejemplo):<project basedir="." default="run" name="Tests"> <target name="clean"> <delete dir="bin"/> </target> <target name="compile"> <mkdir dir="bin"/> <javac srcdir="src" destdir="bin" includeantruntime="false"/> </target> <target name="build" depends="clean,compile"/> <target name="run" depends="build"> <java classname="Main" input="res/in.txt" output="res/out.txt" classpath="bin" /> </target> </project>
En Eclipse, vaya a:
Run->External Tools->External Tools Configurations->Ant Build-> New Launch Configuration
use la siguiente configuración:
Section Main
Buildfile: ${workspace_loc:/Tests/build.xml}
Directorio base: ${workspace_loc:/Tests}
* Nota: Tests es el nombre de mi proyecto Eclipse
Ahora puede ejecutar su proyecto haciendo clic en el botón Ejecutar la barra de herramientas Extenal y cambiar los archivos de entrada o salida según lo necesite
No veo una buena manera de hacerlo usando el diálogo estándar de Ejecución de Eclipse. Sin embargo, es posible que pueda hacerlo con un iniciador de herramientas externo y usar la sintaxis estándar "<infile" o llamar a un script .bat / .sh para que lo haga por usted.
No es automático, que es lo que supongo que quiere, pero puede copiar y pegar el contenido de su archivo en la consola de Eclipse cuando inicia su programa.
Para Linux: creo que la forma más fácil es escribir un sh-script.
1) escriba run.sh así:
su programa con params <input.txt
2) En la configuración del perfil de Eclipse, especifique
[tab Main] C ++ Run Application = / bin / sh
[tab Arguments] Argumentos del programa = run.sh
Eso es. Cuando ejecute su proyecto, verá la salida del script en la consola de eclipse. Puedes hacer algo similar en Windows.
Sorprendentemente, esto no es compatible con Eclipse y parece que no hay planes actuales para agregarlo. Consulte bugs.eclipse.org/bugs/show_bug.cgi?id=155411 para seguir y votar.
Actualizaré aquí si lo implementan.
Tendrás que modificar tu código para que funcione en eclipse. Las otras respuestas anteriores no funcionaron cuando lo intenté. Otro que he visto decir para cambiar Ejecutar ..> Pestaña común> Entrada y salida estándar> El archivo solo cambió el comportamiento estándar al archivo, no a la entrada.
La solución fue tomar la opción "-d" a una solución viable. Si pones algo en los argumentos del programa, simplemente pasará a tu principal. Entonces, lo que puedes hacer al principio de main es algo como esto:
Scanner in;
if (args!=null && args.length>0 && args[0].equals("-d")){
in = new Scanner(new File(args[1]));
} else {
in = new Scanner(System.in);
}
Aún deberá configurar los argumentos de su programa en el menú Ejecutar como se describe en this respuesta.
[Actualización] Como se ha señalado en los comentarios, esta respuesta fue engañosa, así que la actualicé para corregir los errores. [/Actualizar]
En bash o símbolo del sistema, puede hacer: C:/myprogramm < file.txt
(Windows) o ./myprogramm < file.txt
(Linux)
Lamentablemente, en Eclipse no es posible obtener el mismo resultado, ya que no hay ninguna opción para vincular el stdin a un archivo en eclipse. En su lugar, tendrá que abrir manualmente una secuencia de archivos en su código, y luego leer en su lugar. Una forma de hacerlo es usar un argumento de programa para habilitarlo y otro con el parámetro de archivo. Consulte la respuesta de Scott sobre qué tipo de código necesita agregar para analizar la opción -d de la matriz de argumentos del programa.
Cuando desee apuntar a algún archivo dentro de su proyecto Eclipse, debe tener cuidado de obtener la ubicación correcta y usar la variable $ {resource_loc:}:
-d ${resource_loc:/MyProject/file}
por supuesto, también puedes poner una ruta absoluta:
-d path/to/file or -d C:/path/to/file
El parámetro resource_loc se refiere a su espacio de trabajo. Esa es la carpeta donde se almacenan todos los proyectos de eclipse. A partir de ahí, todavía tiene que hacer referencia a la carpeta de su proyecto y luego al archivo que desea cargar.
Puede que tenga que ajustar la dirección de barra diagonal, dependiendo de si usa Linux o Winodws.
< ${workspace_loc:/MyProject/file}
en la configuración de depuración / argumentos / argumentos del programa:
funciona bien para mi