Digamos que tengo mi clase principal en C:\Users\Justian\Documents\
. ¿Cómo puedo hacer que mi programa muestre que está incluido C:\Users\Justian\Documents
?
La codificación rígida no es una opción; debe ser adaptable si se traslada a otra ubicación.
Quiero volcar un montón de archivos CSV en una carpeta, hacer que el programa reconozca todos los archivos, luego cargar los datos y manipularlos. Realmente solo quiero saber cómo navegar hasta esa carpeta.
java
path
working-directory
Justian Meyer
fuente
fuente
Respuestas:
Una forma sería usar la propiedad del sistema,
System.getProperty("user.dir");
esto le dará "El directorio de trabajo actual cuando se inicializaron las propiedades". Probablemente esto es lo que quieres. para averiguar dóndejava
se emitió el comando, en su caso en el directorio con los archivos a procesar, aunque el archivo .jar real puede residir en otro lugar de la máquina. Tener el directorio del archivo .jar real no es tan útil en la mayoría de los casos.A continuación, se imprimirá el directorio actual desde donde se invocó el comando, independientemente de dónde se encuentre el archivo .class o .jar.
si está dentro
/User/me/
y su archivo .jar que contiene el código anterior está en/opt/some/nested/dir/
el comandojava -jar /opt/some/nested/dir/test.jar Test
saldrácurrent dir = /User/me
.También debería considerar como un bono el uso de un buen analizador de argumentos de línea de comando orientado a objetos. Recomiendo encarecidamente JSAP , el analizador de argumentos simple de Java. Esto le permitiría usar
System.getProperty("user.dir")
y, alternativamente, pasar algo más para anular el comportamiento. Una solución mucho más fácil de mantener. Esto haría que pasar en el directorio para procesar sea muy fácil de hacer y podría recurriruser.dir
si no se pasa nada.fuente
user.dir
es mucho más fácil de usar. System.getProperty ("user.dir");Utilice
CodeSource#getLocation()
. Esto también funciona bien en archivos JAR. Puede obtenerCodeSource
porProtectionDomain#getCodeSource()
y,ProtectionDomain
a su vez, puede obtener porClass#getProtectionDomain()
.Actualización según el comentario del OP:
Eso requeriría codificar / conocer su ruta relativa en su programa. Más bien, considere agregar su ruta a la ruta de clases para que pueda usar
ClassLoader#getResource()
O pasar su camino como
main()
argumento.fuente
getLocation()
método. Otros, obviamente, no van a funcionar.Imprime algo como:
Tenga en cuenta que
File.getCanonicalPath()
arroja una IOException marcada pero eliminará cosas como../../../
fuente
fuente
Acabo de usar:
...
fuente
Paths.get("").toAbsolutePath();
Paths.get("my/file").toAbsolutePath()
lo consigo/my/file
, que definitivamente no es el cwd.Si desea obtener su directorio de trabajo actual, use la siguiente línea
fuente
Si desea la ruta absoluta del código fuente actual, mi sugerencia es:
fuente
¿Quién dice que su clase principal está en un archivo en un disco duro local? Las clases se incluyen con mayor frecuencia dentro de archivos JAR y, a veces, se cargan a través de la red o incluso se generan sobre la marcha.
Entonces, ¿qué es lo que realmente quieres hacer? Probablemente haya una forma de hacerlo que no haga suposiciones sobre el origen de las clases.
fuente