¿Cómo puedo cambiar el directorio de trabajo actual desde un programa Java? Todo lo que he podido encontrar sobre el problema afirma que simplemente no puede hacerlo, pero no puedo creer que ese sea realmente el caso.
Tengo un código que abre un archivo usando una ruta de archivo relativa codificada desde el directorio en el que normalmente se inició, y solo quiero poder usar ese código desde un programa Java diferente sin tener que iniciarlo desde dentro Un directorio particular. Parece que debería poder llamar System.setProperty( "user.dir", "/path/to/dir" )
, pero por lo que puedo entender, llamar a esa línea simplemente falla en silencio y no hace nada.
Entendería si Java no le permitiera hacer esto, si no fuera por el hecho de que le permite obtener el directorio de trabajo actual, e incluso le permite abrir archivos utilizando rutas de archivos relativas ...
fuente
Respuestas:
No hay una forma confiable de hacer esto en Java puro. Establecer la
user.dir
propiedad a través deSystem.setProperty()
ojava -Duser.dir=...
parece afectar las creaciones posteriores deFiles
, pero no por ejemploFileOutputStreams
.los
File(String parent, String child)
constructor puede ayudar si construye su ruta de directorio por separado de su ruta de archivo, lo que permite un intercambio más fácil.Una alternativa es configurar un script para ejecutar Java desde un directorio diferente, o usar el código nativo JNI como se sugiere a continuación .
El error Sun relevante se cerró en 2008 como "no se solucionará".
fuente
new FileOutputStream("foo.txt").close();
crea el archivo en el directorio de trabajo original incluso si user.dir es cambiado por el programa.Si ejecuta su programa heredado con ProcessBuilder , podrá especificar su directorio de trabajo .
fuente
No es una forma de hacer esto utilizando la propiedad del sistema "user.dir". La parte clave a entender es que se debe llamar a getAbsoluteFile () (como se muestra a continuación) o de lo contrario las rutas relativas se resolverán con el valor predeterminado "user.dir".
fuente
user.dir
. El hecho de que el camino absoluto se vuelva crítico lo demuestra.Es posible cambiar el PWD, utilizando JNA / JNI para hacer llamadas a libc. Los chicos de JRuby tienen una práctica biblioteca java para hacer llamadas POSIX llamada jna-posix Aquí está la información de Maven
Puede ver un ejemplo de su uso aquí (código Clojure, lo siento). Mira la función chdirToRoot
fuente
user.dir
propiedad del sistema,File.getAbsolutePath()
se resolverá en contrauser.dir
, mientras que la ruta de acceso en Archivo se resuelve en el directorio de trabajo del sistema operativo.Como se mencionó, no puede cambiar el CWD de la JVM, pero si iniciara otro proceso usando Runtime.exec (), puede usar el método sobrecargado que le permite especificar el directorio de trabajo. Esto no es realmente para ejecutar su programa Java en otro directorio, pero en muchos casos cuando uno necesita iniciar otro programa como un script Perl, por ejemplo, puede especificar el directorio de trabajo de ese script mientras deja el directorio de trabajo de la JVM sin cambios.
Ver Runtime.exec javadocs
Específicamente,
¿Dónde
dir
está el directorio de trabajo para ejecutar el subproceso?fuente
Si entiendo correctamente, un programa Java comienza con una copia de las variables de entorno actuales. Cualquier cambio mediante
System.setProperty(String, String)
está modificando la copia, no las variables de entorno originales. No es que esto proporcione una razón exhaustiva de por qué Sun eligió este comportamiento, pero tal vez arroja un poco de luz ...fuente
-D
. Pero estoy de acuerdo, en JVM iniciar propiedades predefinidas comouser.dir
ser copiado del sistema operativo y cambiarlas más tarde no ayuda.user.dir
afectaFile.getAbsolutePath()
yFile.getCanonicalPath()
, pero no la idea del SO del directorio de trabajo, que dicta cómo se resuelven los nombres de ruta de los archivos al acceder a los archivos.El directorio de trabajo es una característica del sistema operativo (se establece cuando se inicia el proceso). ¿Por qué no simplemente pasa su propia propiedad del Sistema (
-Dsomeprop=/my/path
) y la usa en su código como padre de su Archivo:fuente
Lo más inteligente / fácil de hacer aquí es cambiar su código para que, en lugar de abrir el archivo, suponga que existe en el directorio de trabajo actual (supongo que está haciendo algo así
new File("blah.txt")
, simplemente cree la ruta del archivo usted mismo.Deje que el usuario pase al directorio base, léalo desde un archivo de configuración, recurra a
user.dir
si no se pueden encontrar las otras propiedades, etc. Pero es mucho más fácil mejorar la lógica en su programa que cambiar cómo Las variables de entorno funcionan.fuente
He intentado invocar
String oldDir = System.setProperty("user.dir", currdir.getAbsolutePath());
Parece funcionar. Pero
File myFile = new File("localpath.ext"); InputStream openit = new FileInputStream(myFile);
lanza un
FileNotFoundException
pensamientomyFile.getAbsolutePath()
Muestra la ruta correcta. He leído este . Creo que el problema es:
La solución puede ser:
File myFile = new File(System.getPropety("user.dir"), "localpath.ext");
Crea un Objeto de archivo como absoluto con el directorio actual que es conocido por la JVM. Pero ese código debe existir en una clase usada, necesita cambiar los códigos reutilizados.
~~~~ JcHartmut
fuente
Puedes usar
después
Imprimirá
fuente
System.setProperty("user.dir", "/some/directory")
La otra posible respuesta a esta pregunta puede depender de la razón por la que está abriendo el archivo. ¿Es este un archivo de propiedades o un archivo que tiene alguna configuración relacionada con su aplicación?
Si este es el caso, puede considerar intentar cargar el archivo a través del cargador de classpath, de esta manera puede cargar cualquier archivo al que Java tenga acceso.
fuente
Si ejecuta sus comandos en un shell, puede escribir algo como "java -cp" y agregar los directorios que desee separados por ":" si java no encuentra algo en un directorio, intentará encontrarlos en los otros directorios, eso es lo que hago
fuente
Puede cambiar el directorio de trabajo real del proceso utilizando JNI o JNA.
Con JNI, puede usar funciones nativas para configurar el directorio. El método POSIX es
chdir()
. En Windows, puedes usarSetCurrentDirectory()
.Con JNA, puede ajustar las funciones nativas en carpetas de Java.
Para ventanas:
Para sistemas POSIX:
fuente
Use FileSystemView
fuente