2010-07-22 24 views
8

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?

+0

Supongo que si la entrada se transfiere como un programa arg, le gustaría pasar una entrada arbitraria al programa. ¿Es eso correcto? –

+0

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

Respuesta

8

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"); 
    // ... 
} 
+0

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. –

+0

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

1

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.

+0

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

+0

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

0

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.

0

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.

0

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).

+0

El directorio de trabajo actual también está disponible a través de la propiedad del sistema "user.dir". –

0

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.

Cuestiones relacionadas