¿Cambiar el directorio de trabajo actual en Java?
¿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 puedes hacerlo, pero no puedo creer que ese sea realmente el caso.
Tengo un fragmento de código que abre un archivo usando una ruta de archivo relativa codificada desde el directorio en el que normalmente se inicia, y solo quiero poder usar ese código desde un programa Java diferente sin tener que iniciarlo desde dentro. un directorio determinado. Parece que deberías poder llamarSystem.setProperty( "user.dir", "/path/to/dir" )
, pero hasta donde puedo entender, llamar a esa línea falla silenciosamente y no hace nada.
Lo 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 usando rutas de archivo relativas...
No existe una forma confiable de hacer esto en Java puro. Establecer la user.dir
propiedad mediante System.setProperty()
o java -Duser.dir=...
parece afectar las creaciones posteriores de Files
, pero no, por ejemplo FileOutputStreams
.
El File(String parent, String child)
constructor puede ayudar si crea la ruta del directorio por separado de la ruta del archivo, lo que permite un intercambio más fácil.
Una alternativa es configurar un script para ejecutar Java desde un directorio diferente o utilizar el código nativo JNI como se sugiere a continuación .
El error relevante de OpenJDK se solucionó en 2008 porque "no se solucionará".
Si ejecuta su programa heredado con ProcessBuilder , podrá especificar su directorio de trabajo .
Hay una manera de hacer esto usando la propiedad del sistema "user.dir". La parte clave que hay que 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".
import java.io.*;
public class FileUtils
{
public static boolean setCurrentDirectory(String directory_name)
{
boolean result = false; // Boolean indicating whether directory was set
File directory; // Desired current working directory
directory = new File(directory_name).getAbsoluteFile();
if (directory.exists() || directory.mkdirs())
{
result = (System.setProperty("user.dir", directory.getAbsolutePath()) != null);
}
return result;
}
public static PrintWriter openOutputFile(String file_name)
{
PrintWriter output = null; // File to open for writing
try
{
output = new PrintWriter(new File(file_name).getAbsoluteFile());
}
catch (Exception exception) {}
return output;
}
public static void main(String[] args) throws Exception
{
FileUtils.openOutputFile("DefaultDirectoryFile.txt");
FileUtils.setCurrentDirectory("NewCurrentDirectory");
FileUtils.openOutputFile("CurrentDirectoryFile.txt");
}
}