¿Cambiar el directorio de trabajo actual en Java?

Resuelto Nick asked hace 15 años • 14 respuestas

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

Nick avatar May 08 '09 21:05 Nick
Aceptado

No existe una forma confiable de hacer esto en Java puro. Establecer la user.dirpropiedad 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á".

Michael Myers avatar May 08 '2009 14:05 Michael Myers

Si ejecuta su programa heredado con ProcessBuilder , podrá especificar su directorio de trabajo .

PhiLho avatar May 08 '2009 15:05 PhiLho

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");
    }
}
Steve K avatar Dec 20 '2012 23:12 Steve K