Im tratando de escribir un programa para leer un archivo de texto a través de args pero cuando lo ejecuto, siempre dice que el archivo no se puede encontrar aunque lo coloque dentro de la misma carpeta que el main.java que estoy ejecutando. ¿Alguien sabe la solución a mi problema o una mejor manera de leer un archivo de texto?¿Cómo pasar un archivo de texto como argumento?
Respuesta
No utilice las rutas relativas en java.io.File
.
Se convertirá en relativo al directorio de trabajo actual que depende de la forma en que ejecuta la aplicación que a su vez no es controlable desde el interior de la aplicación. Solo conducirá a problemas de portabilidad. Si lo ejecuta desde dentro de Eclipse, la ruta será relativa a /path/to/eclipse/workspace/projectname
. Si lo ejecuta desde la consola de comandos, será relativo a la carpeta abierta actualmente (¡aunque lo haga al ejecutar el código por la ruta absoluta!). Si lo ejecuta haciendo doble clic en el JAR, será relativo a la carpeta raíz del JAR. Si lo ejecuta en un servidor web, será relativo al /path/to/webserver/binaries
. Etcétera
Utilice siempre las rutas absolutas en java.io.File
, sin excusas.
Para una mejor portabilidad y menos dolor de cabeza con rutas de acceso absolutas, simplemente coloque el archivo en una ruta cubierta por el classpath de tiempo de ejecución (o agregue su ruta al classpath en tiempo de ejecución). De esta forma, puede obtener el archivo por Class#getResource()
o su contenido por Class#getResourceAsStream()
. Si está en la misma carpeta (paquete) que su clase actual, entonces ya está en el classpath. Para acceder a ella, acaba de hacer:
public MyClass() {
URL url = getClass().getResource("filename.txt");
File file = new File(url.getPath());
InputStream input = new FileInputStream(file);
// ...
}
o
public MyClass() {
InputStream input = getClass().getResourceAsStream("filename.txt");
// ...
}
Puede especificar el directorio de trabajo en Eclipse. Está en el diálogo bajo "ejecutar como". Es una forma de usar rutas relativas y aun obtener un comportamiento razonable dentro de Eclipse. –
Es cierto que siempre habrá soluciones temporales y ducktapes, pero realmente no desea que su aplicación dependa permanentemente de eso cuando hay formas mucho mejores. – BalusC
Intente dar una ruta de acceso absoluta al nombre de archivo.
Además, publique el código para que podamos ver exactamente lo que está intentando.
No se puede pasar esta línea: Escáner sc1 = nuevo Escáner (nuevo Archivo (args [0])); y pasé mi archivo de texto como el primer arg – Victor
La combinación de líneas puede ayudar a acortar el código y posiblemente mejorar el rendimiento (velocidad), pero cuando se depura, ayuda a dividir las cosas (es decir, no incorporar constructores dentro de los constructores). Cree un objeto File, vea si este es el lugar donde el programa se dispara. De lo contrario, pase el objeto File al Scanner (en una línea separada) y vea qué tipo de error se produce. – chimeracoder
Si está utilizando Eclipse (o un IDE similar), el problema surge del hecho de que su programa se ejecuta desde algunos directorios arriba donde se encuentra la fuente real. Intente mover su archivo un nivel o dos en el árbol del proyecto.
Consulte this question para obtener más información.
Si coloca el archivo y la clase de trabajo con ella bajo un mismo envase se puede usar esto:
Class A {
void readFile (String fileName) {
Url tmp = A.class.getResource (fileName);
// Or Url tmp = this.getClass().getResource (fileName);
File tmpFile = File (tmp);
if (tmpFile.exists())
System.out.print("I found the file.")
}
}
Será de ayuda si usted lee sobre los cargadores de clases.
Cuando abre un archivo con un nombre de archivo relativo en Java (y en general) lo abre en relación con el directorio de trabajo.
se encuentra el directorio de trabajo actual de su proceso utilizando
String workindDir = new File(".").getAbsoultePath()
Asegúrese de que está ejecutando el programa desde el directorio correcto (o cambiar el nombre del archivo para que sea en relación con el que está ejecutando desde).
El directorio de trabajo actual también está disponible a través de la propiedad del sistema "user.dir". –
La solución más sencilla es crear un nuevo archivo, a continuación, ver dónde está el archivo de salida es. Ese es el lugar correcto para poner su archivo de entrada.
- 1. Pasar un método como argumento
- 2. Pasar matriz como argumento
- 3. Buen diseño: cómo pasar InputStreams como argumento?
- 4. ¿Se puede pasar un "tipo" como argumento?
- 5. pasar un tipo como argumento atributo
- 6. Cómo pasar una clase parametrizada como argumento
- 7. ¿Cómo pasar tuple como argumento en Python?
- 8. pasar matriz de caracteres como argumento
- 9. Pasar una variable como argumento de plantilla
- 10. Cómo pasar un archivo como argumento de línea de comando en Netbeans
- 11. Cómo pasar ENUM como argumento de función en C
- 12. ¿Cómo pasar la función de miembro como argumento en python?
- 13. Pasar un objeto anónimo como argumento en C#
- 14. Cómo pasar objeto cin o ifstream como la función argumento
- 15. ¿Cómo pasar todos los argumentos como colección a otra función y no como un solo argumento?
- 16. Cómo pasar un atributo de sesión como argumento de un método (parámetros) con Spring MVC
- 17. Al pasar un argumento a una ranura
- 18. ¿Pasar la lista como argumento al módulo Python C?
- 19. Pasar cadenas largas (como argumento) a una aplicación de consola
- 20. ¿Cómo pasar un argumento de tupla de la mejor manera?
- 21. Pasar un nombre de archivo como un argumento de línea de comando a la secuencia de comandos Octave de GNU
- 22. ¿Qué archivo debo pasar como argumento de nombre de ruta de ftok()
- 23. Pasar la función como argumento al método Objective-C
- 24. ¿Cómo pasar un argumento al llamar a un archivo de vista?
- 25. python argh/argparse: ¿Cómo puedo pasar una lista como un argumento de línea de comandos?
- 26. En MySQL: ¿Cómo pasar un nombre de tabla como procedimiento almacenado y/o argumento de función?
- 27. ¿Cómo puedo pasar un nombre de clase como argumento a una fábrica de objetos en cacao?
- 28. py3k: ¿Cómo se lee un archivo dentro de un archivo zip como texto, no como bytes?
- 29. Perl: ¿Cómo pasar y usar un manejador de archivo léxico a una subrutina como argumento con nombre?
- 30. Puntero de función como argumento
Supongo que si la entrada se transfiere como un programa arg, le gustaría pasar una entrada arbitraria al programa. ¿Es eso correcto? –
Umm no realmente. ¿Estás hablando de métodos o funciones? Estoy hablando de una clase que paso en una discusión y cuando ejecuto el método principal, debería leer el archivo de texto, pero no es así. Mi código es Scanner sc1 = new Scanner (nuevo archivo (args [0])); Al depurar, ni siquiera podía pasar esta línea. – Victor