Obtener el Directorio de Trabajo Actual en Java

Quiero acceder a mi directorio de trabajo actual utilizando

 String current = new java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
 String currentDir = System.getProperty("user.dir");
        System.out.println("Current dir using System:" +currentDir);

De salida:

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32

Mi salida no es correcta porque la unidad C no es mi directorio actual.
Necesita ayuda en este sentido.

  • puedes pegar aquí lo que se ve cuando se ejecuta cd de comando en el símbolo del sistema cuando se ejecuta este?
  • ¿Qué es lo que estamos tratando de lograr al acceder al directorio de trabajo? Podría ser hecho mediante el uso de la ruta de clases en su lugar? Por ejemplo, si usted necesita para leer un archivo de texto en el sistema de archivos, usted puede encontrar fácilmente cuando está en la ruta de clase.
  • cómo? Podría usted comentar por favor?
  • Para obtener información acerca de cómo acceder a un archivo en la ruta de clase, consulte stackoverflow.com/questions/1464291/…
  • Para propósitos de depuración, el directorio de trabajo podría ser útil para saber si el programa no parece ser capaz de acceder a los archivos que existen.
  • Ambos métodos (y los métodos de abajo) es correcta. Si usted consigue el directorio de sistema como CWD entonces esto podría ser debido a un contenedor de hacer un CD antes de comenzar Java. Por ejemplo javapath podría hacer esto. Especifique la ruta de acceso java.exe a la real Java_:directorio home directamente para evitar esto.
  • Tenga en cuenta que una cosa es el directorio de trabajo, y otros el directorio si su clase reside. Ellos generalmente no son los mismos.
  • ¿Alguna de las siguientes respuestas resolver su caso? Usted puede escoger uno de ellos como su respuesta?

InformationsquelleAutor Qazi | 2011-02-02

20 Kommentare

  1. 1096
    public class JavaApplication1 {
      public static void main(String[] args) {
           System.out.println("Working Directory = " +
                  System.getProperty("user.dir"));
      }
    }

    Esto imprimirá una completo de ruta de acceso absoluta de que la aplicación se ha inicializado.

    • es por eso que he mencionado específicamente que se va a imprimir la ruta de acceso de la aplicación donde había inicializado. Supongo que en el hilo de arranque directamente ejecutar el jar/programa después de iniciar commnad símbolo del sistema (que es básicamente en C:\WINDOWS\system32). Espero que entiendan mi punto. Suponiendo que usted votada abajo, agradezco que al menos se preocupaba de dejar una respuesta. 🙂
    • usuario.dir va a obtener la ruta a la carpeta en la cual el proceso se puso en marcha. Para obtener la ruta de acceso real a la aplicación de la carpeta principal de ver mi respuesta a continuación.
    • El problema con el usuario».dir» la propiedad es, tan pronto alguien pasar como -Duser.dir=... o establecido dentro del código con System.setProperty("user.dir", ...) todo el código de confiar en ella se produce un error.
    • Me refiero a «todo el código de confiar en ella para encontrar el directorio actual falla.». No todo el código en general. (Yo era lento para editar el comentario original)
    • si el usuario setted -Duser.dir, propable que desea ejecutar este en la costumbre de directorio de trabajo.
    • Estoy de completo acuerdo con usted. En ese caso, el usuario no debe esperar para obtener el directorio desde el que java fue llamado (no se de donde la java ejecutable es sotred) por System.getProperty("user.dir"). Lo que quiero decir a todo el código que se basa en que el hecho de que no se comporte como se espera.
    • de hecho, esta respuesta es incorrecta, hay una sutil diferencia entre un usuario de directorio de trabajo y una corriente de directorio de trabajo de un proceso del sistema (cwd); más de tiempo que el usuario».dir», señala el cwd de un (java)proceso; pero «de usuario.dir» tiene diferentes semántica y no deben ser utilizados para obtener el cwd de un proceso java; btw:hay más propiedades disponibles para java proceso de docs.oracle.com/javase/tutorial/essential/environment/… sólo para referencia
    • Tengo null cuando se utiliza System.out.println(System.getProperty("user.dir"))
    • Downvote para no explicar suficientemente cómo el Sistema.getProperty(«user.dir») funciona.
    • intente ejecutar este comando con el usuario root, se encuentra el usuario.dir como «/»

  2. 363

    Ver: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

    Utilizando java.nio.file.Path y java.nio.file.Paths, puede hacer lo siguiente para mostrar lo que Java piensa que es su ruta actual. Este 7 y en, y utiliza NIO.

    Path currentRelativePath = Paths.get("");
    String s = currentRelativePath.toAbsolutePath().toString();
    System.out.println("Current relative path is: " + s);

    Esto salidas Current relative path is: /Users/george/NetBeansProjects/Tutorials que en mi caso es donde me encontré con la clase de. La construcción de caminos de manera relativa, por no usar una de las principales separador para indicar que usted está construyendo una ruta de acceso absoluta, va a utilizar esta ruta de acceso relativa como punto de partida.

    • La primera haven’ t comprobado, pero el segundo será en realidad conseguir tu carpeta de inicio. No es el directorio de trabajo actual en el que se ejecuta la aplicación.
    • Por favor, no confundir el directorio home del usuario («usuario».casa» /Usuarios/george en su caso) y el directorio de trabajo actual («el usuario».dir», que será el directorio desde el que se inició la JVM para su aplicación, por lo que podría ser algo como por ejemplo: /users/george/workspace/FooBarProject).
    • Yo prefiero esta. Cuando necesito el padre del directorio de trabajo, esto no no de trabajo: Paths.get("").getParent(), da null. En lugar de esto funciona: Paths.get("").toAbsolutePath().getParent().
  3. 221

    Las siguientes obras en Java 7 y seguridad (véase el aquí para la documentación).

    import java.nio.file.Paths;
    
    Paths.get(".").toAbsolutePath().normalize().toString();
    • Cómo es esto mejor que el portátil más import java.io.File; File(".").getAbsolutePath() ?
    • Cuando dices portátil, usted quiere decir que funciona en Java 6 y versiones anteriores? Paths.get() puede ser considerada mejor que da acceso directo a los más poderosos Path de la interfaz.
    • ¿Cuál es la ventaja potencial de la utilización de .normalize() en este contexto?
    • De Javadoc: (normalizar el método de) Returns a path that is this path with redundant name elements eliminated.
  4. 60

    Esto le dará la ruta de su directorio de trabajo actual:

    Path path = FileSystems.getDefault().getPath(".");

    Y esto le dará la ruta de acceso a un archivo llamado «Foo.txt» en el directorio de trabajo:

    Path path = FileSystems.getDefault().getPath("Foo.txt");

    Edición :
    Para obtener una ruta de acceso absoluta del directorio actual:

    Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
    • esto sólo devuelve ‘.’ para mí.
    • Sí, en muchos de los sistemas que serán la referencia para el directorio de trabajo. Para obtener la ruta absoluta usted puede agregar una más llamada al método Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
    • Usted no necesita la foo.txt, solo tienes que poner una cadena vacía para obtener el directorio
    • En Windows (10) esto sólo me da un Path objeto que apunta a un archivo llamado . dentro de la corriente de trabajo de la dir. Utilizar una cadena vacía, en lugar de "." trabajó para mí.
  5. 33

    Esta es la solución para mí

    File currentDir = new File("");
    • Esto tiene efectos secundarios cuando se utiliza un objeto de Archivo como un padre de otro Archivo: Archivo nuevo(new File(«»), «subdir») no funcionan como se esperaba
    • Para solucionar este problema, utilice new File("").getAbsoluteFile() lugar.
    • Para lo que vale, he tenido mejor suerte con el Archivo(«.»).
    • Cómo Definir una Ruta de acceso Relativa en Java Esta Página me ayudó. También supuse que debo utilizar / a la hora de crear una ruta de acceso relativa. Yo estaba equivocado, no empiecen con /. ../ también funciona para subir en el árbol de directorios.
    • Que me dio un archivo en el directorio actual llamado ..
  6. 30

    ¿Qué te hace pensar que c:\windows\system32 no es su directorio actual? El usuario.dir propiedad está explícitamente a ser «Usuario del directorio de trabajo actual».

    Para decirlo de otra manera, a menos que empezar de Java desde la línea de comandos, c:\windows\system32 probablemente es su CWD. Es decir, si hace doble clic para iniciar el programa, el CWD es poco probable que sea el directorio en el que se haga doble clic en desde.

    Editar: parece que esto sólo es cierto para el viejo windows y/o versiones de Java.

    • Esto no parece ser cierto, al menos no en mi equipo con Windows 7 usando Java 7. user.dir es constantemente la carpeta donde me haga doble clic en el archivo jar.
  7. 25

    Uso CodeSource#getLocation().

    Esto funciona bien en los archivos JAR así. Usted puede obtener CodeSource por ProtectionDomain#getCodeSource() y la ProtectionDomain a su vez puede ser obtenida por Clase#getProtectionDomain().

    public class Test {
        public static void main(String... args) throws Exception {
            URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
            System.out.println(location.getFile());
        }
    }
    • Esto devuelve la ubicación del archivo JAR. No lo que se le pidió.
  8. 22
    this.getClass().getClassLoader().getResource("").getPath()
    • Lanza un NPE cuando ejecuto mi aplicación desde un archivo JAR haciendo doble clic en él.
    • Esto devuelve "" si la aplicación se ejecuta desde un archivo JAR, o un elemento CLASSPATH. No lo que se le pidió.
    • es un método de objeto, por lo que en un contexto estático sólo la eliminación de la this no funciona. Tendrías que explícitamente se refieren a la clase que usted está haciendo MyClass.class.getClassLoader()......
    • Sin embargo, no devolver el directorio de trabajo …
  9. 17

    por lo general, como un objeto de Archivo:

    File getCwd() {
      return new File("").getAbsoluteFile();
    }

    puede que desee tener plena cadena calificada como «D:/a/b/c» haciendo:

    getCwd().getAbsolutePath()
    • Esto funciona bien en Android pruebas ya que Android no incluye java.de nio.archivo.Los archivos.
    • No parece trabajar para mí en un contexto estático (new File(«») throws NullPointerException)..?
    • es probable que use un Archivo incorrecto objeto: Sistema.a cabo.println(new java.io.Archivo(«»).getAbsolutePath());
  10. 5

    Utilizando el usuario de Windows.dir devuelve el directorio como se esperaba, pero NO cuando se inicia la aplicación con privilegios elevados (ejecutar como administrador), en ese caso, puede C:\WINDOWS\system32

  11. 4

    Sobre Linux cuando ejecute un frasco archivo de terminal, estos dos se devolverá la misma String: «/home/CurrentUser», no importa, donde está el archivo jar es. Depende sólo de lo actual directorio está utilizando con su terminal, al iniciar el archivo jar.

    Paths.get("").toAbsolutePath().toString();
    
    System.getProperty("user.dir");

    Si su Class con main sería llamado MainClass, a continuación, intente:

    MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();

    Esto devolverá una String con ruta de acceso absoluta de la frasco archivo.

    • Que no es lo que se le pidió.
  12. 4

    Directorio de trabajo actual se define de manera diferente en diferentes implementaciones de Java. Para ciertas versiones anteriores a la versión de Java 7 no había manera consistente para obtener el directorio de trabajo. Usted puede evitar esto con el lanzamiento de archivo Java con -D y la definición de una variable para almacenar la información de

    Algo como

    java -D com.mycompany.workingDir="%0"

    Que no es del todo correcto, pero usted consigue la idea. Luego System.getProperty("com.mycompany.workingDir")

    • No es pertinente a la cuestión.
    • Tiene un significado para Java – que es la ubicación en el disco donde los archivos que se abren con nombres de rutas relativas son relativas.
    • Sí, tiene un significado. Mis palabras fueron algo mal elegido. Pero se olvida el punto antes de Java 7 no había manera de saber el directorio de trabajo actual, y las diferentes implementaciones conjunto de ellos…de otra manera…
  13. 3

    Espero que desea acceder el directorio actual, incluyendo el paquete, es decir, Si el programa de Java es en c:\myApp\com\foo\src\service\MyTest.java y desea imprimir hasta c:\myApp\com\foo\src\service entonces usted puede intentar el siguiente código:

    String myCurrentDir = System.getProperty("user.dir")
                + File.separator
                + System.getProperty("sun.java.command")
                        .substring(0, System.getProperty("sun.java.command").lastIndexOf("."))
                        .replace(".", File.separator);
        System.out.println(myCurrentDir);

    Nota: Este código sólo es probado en Windows con Oracle JRE.

    • Sería un flaco favor si no downvote esta respuesta. Por favor, pensar más cuidadosamente antes de publicar. El código está roto, a menos que todas estas son verdaderas: 1. el JRE de Oracle, de lo contrario no habrá «el sol.java.comando» propiedades del sistema → NPE; 2. el sistema operativo es Windows (Uso File.separator lugar, o un multi-argumento File constructor); 3. el classpath es especificado en la línea de comando, y el ‘directorio actual, incluyendo el paquete'(??) es: una. especificada en primer lugar, b. especifica absolutamente, c. coincide con el CWD exactamente (incluso con Windows caso de falta de sensibilidad), y d. es un descendiente de la CWD
    • Que las direcciones de los puntos 1 y 2. Pero a menos que me estoy perdiendo algo, sigues confiando en la ruta de clases está especificado en la línea de comandos (es decir, no en una variable de entorno), y para el «directorio actual, incluyendo el paquete’ (tengo que admitir que realmente no entiendo lo que quieres decir por que) ser descendiente de específicamente el primer elemento en el classpath. Y en el caso de que coincidan problema sigue. Lo siento si mi comentario no era útil; he sacrificado claridad para mantener en el comentario límite de caracteres.
    • sólo «funciona perfectamente» en algunos ambientes; usted acaba de pasar a tener la suerte de probarlo en onesuch. Software de escritura que se produce un error en la legítima entornos de tiempo de ejecución no es una buena práctica, incluso cuando el conjunto de entornos de prueba no es expansivo suficiente para incluirlos.
    • Tienes razón, eso no es una buena práctica. Afortunadamente, esta solución «solv[ing] mi problema específico de» no provocar «[error] en legítima entornos de tiempo de ejecución.» De hecho, me ayudó a resolver un fracaso y escribir código más robusto, además de resolver el asunto muy específico que tenía (que era sólo algo relacionado con esta pregunta/respuesta). Supongo que fue suerte para encontrarlo.
  14. 3

    Mencionar que no solo se comprueba en Windows pero creo que funciona perfecto en otros Sistemas Operativos [Linux,MacOs,Solaris] :).


    Me había 2 .jar archivos en el mismo directorio . Yo quería desde el .jar archivo para iniciar el otro .jar archivo que está en el mismo directorio.

    El problema es que cuando inicio desde el cmd el directorio actual es system32.


    Advertencias!

    • La de abajo parece funcionar bastante bien en todas las pruebas que he hecho, incluso
      con el nombre de la carpeta ;][[;'57f2g34g87-8+9-09!2#@!$%^^&() o ()%&$%^@#
      funciona bien.
    • Estoy usando el ProcessBuilder con la siguiente de la siguiente manera:

    🍂..

    //The class from which i called this was the class `Main`
    String path = getBasePathForClass(Main.class);
    String applicationPath=  new File(path + "application.jar").getAbsolutePath();
    
    
    System.out.println("Directory Path is : "+applicationPath);
    
    //Your know try catch here
    //Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
    ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath);
    builder.redirectErrorStream(true);
    Process process = builder.start();
    
    //...code

    🍂getBasePathForClass(Class<?> classs):

        /**
         * Returns the absolute path of the current directory in which the given
         * class
         * file is.
         * 
         * @param classs
         * @return The absolute path of the current directory in which the class
         *         file is.
         * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
         */
        public static final String getBasePathForClass(Class<?> classs) {
    
            //Local variables
            File file;
            String basePath = "";
            boolean failed = false;
    
            //Let's give a first try
            try {
                file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
    
                if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
                    basePath = file.getParent();
                } else {
                    basePath = file.getPath();
                }
            } catch (URISyntaxException ex) {
                failed = true;
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Cannot firgue out base path for class with way (1): ", ex);
            }
    
            //The above failed?
            if (failed) {
                try {
                    file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                    basePath = file.getAbsolutePath();
    
                    //the below is for testing purposes...
                    //starts with File.separator?
                    //String l = local.replaceFirst("[" + File.separator +
                    //"/\\\\]", "")
                } catch (URISyntaxException ex) {
                    Logger.getLogger(classs.getName()).log(Level.WARNING,
                            "Cannot firgue out base path for class with way (2): ", ex);
                }
            }
    
            //fix to run inside eclipse
            if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                    || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
                basePath = basePath.substring(0, basePath.length() - 4);
            }
            //fix to run inside netbeans
            if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
                basePath = basePath.substring(0, basePath.length() - 14);
            }
            //end fix
            if (!basePath.endsWith(File.separator)) {
                basePath = basePath + File.separator;
            }
            return basePath;
        }
    • Esto devuelve la ubicación del archivo JAR. No lo que se le pidió.
    • La ubicación de el .el archivo jar no es el directorio de trabajo actual del programa java?
  15. 1

    suponga que usted está tratando de ejecutar el proyecto dentro de eclipse, o netbean o independiente de la línea de comandos. He de escribir un método para solucionarlo

    public static final String getBasePathForClass(Class<?> clazz) {
        File file;
        try {
            String basePath = null;
            file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
            //fix to run inside eclipse
            if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                    || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
                basePath = basePath.substring(0, basePath.length() - 4);
            }
            //fix to run inside netbean
            if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
                basePath = basePath.substring(0, basePath.length() - 14);
            }
            //end fix
            if (!basePath.endsWith(File.separator)) {
                basePath = basePath + File.separator;
            }
            return basePath;
        } catch (URISyntaxException e) {
            throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
        }
    }

    A utilizar, en todas partes usted quiere conseguir ruta de base de leer el archivo, usted puede pasar su anclaje de clase a sobre el método, el resultado puede ser la cosa que usted necesita 😀

    Mejor,

    • Esto devuelve la ubicación del archivo JAR. No lo que se le pidió.
    • sí, sé que esta respuesta no es la verdadera respuesta para la pregunta, pero la mayoría del tiempo, todo el mundo quiere conseguir el «directorio donde los frascos se encuentra» en lugar de «línea de comandos de directorio de trabajo».
  16. 0

    Ninguna de las respuestas publicadas aquí trabajó para mí. Aquí es lo que hizo el trabajo:

    java.nio.file.Paths.get(
      getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
    );

    Edit: La versión final, en mi código:

    URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
    java.net.URI myURI = null;
    try {
        myURI = myURL.toURI();
    } catch (URISyntaxException e1) 
    {}
    return java.nio.file.Paths.get(myURI).toFile().toString()
    • Esto devuelve la ubicación del archivo JAR. No lo que se le pidió.
  17. -7

    este es el directorio actual nombre

    String path="/home/prasad/Desktop/folderName";
    File folder = new File(path);
    String folderName=folder.getAbsoluteFile().getName();

    esta es la ruta del directorio actual

    String path=folder.getPath();
    • El OP quería que el trabajo actual dir de donde se ejecutó la aplicación de.
    • Este es la casa el directorio, ni a nadie del directorio de trabajo actual, excepto tal vez la tuya. No lo que se le pidió.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein