Ändern des aktuellen Arbeitsverzeichnisses in Java?

Lesezeit: 6 Minuten

Wie kann ich das aktuelle Arbeitsverzeichnis in einem Java-Programm ändern? Alles, was ich über das Problem finden konnte, behauptet, dass Sie es einfach nicht tun können, aber ich kann nicht glauben, dass das wirklich der Fall ist.

Ich habe einen Code, der eine Datei mit einem fest codierten relativen Dateipfad aus dem Verzeichnis öffnet, in dem sie normalerweise gestartet wird, und ich möchte diesen Code nur in einem anderen Java-Programm verwenden können, ohne ihn von dort aus starten zu müssen ein bestimmtes Verzeichnis. Es scheint, als müssten Sie nur anrufen können System.setProperty( "user.dir", "/path/to/dir" )aber soweit ich herausfinden kann, schlägt das Aufrufen dieser Leitung einfach stillschweigend fehl und tut nichts.

Ich würde verstehen, wenn Java Ihnen dies nicht erlauben würde, wenn es Ihnen nicht erlaubt wäre bekommen das aktuelle Arbeitsverzeichnis und erlaubt Ihnen sogar, Dateien mit relativen Dateipfaden zu öffnen….

  • Das Erhalten und Verwenden von Informationen ist etwas anderes, als sie zu ändern. Zum Beispiel können Sie unter Windows leicht Umgebungsvariablen erhalten, aber es ist schwieriger, sie zu ändern (systemweit).

    – Philho

    8. Mai 2009 um 14:58 Uhr

  • bugs.java.com/bugdatabase/view_bug.do?bug_id=4045688 heißt es in der Bewertungssektion “Seitdem haben sich keine weiteren Kunden gemeldet oder wurden anderweitig identifiziert. …” und seit 2018 haben wir rund 175.000 Aufrufe zu dieser Frage 🙁

    – Wolfgang Fahl

    16. September 2018 um 8:27 Uhr

Andern des aktuellen Arbeitsverzeichnisses in Java
Michael myers

In reinem Java gibt es dafür keine zuverlässige Möglichkeit. Einstellung der user.dir Eigentum über System.setProperty() oder java -Duser.dir=... scheint nachfolgende Kreationen von zu beeinflussen Filesaber nicht zB FileOutputStreams.

Die File(String parent, String child) Der Konstruktor kann helfen, wenn Sie Ihren Verzeichnispfad getrennt von Ihrem Dateipfad aufbauen, was ein einfacheres Austauschen ermöglicht.

Alternativ können Sie ein Skript einrichten, um Java aus einem anderen Verzeichnis auszuführen, oder den nativen JNI-Code verwenden, wie unten vorgeschlagen.

Der relevante Sun-Bug wurde 2008 als “wird nicht behoben” geschlossen.

  • Ich glaube nicht, dass ich einen einzigen Unterschied zwischen Java und C# gefunden habe, der mich denken lässt: “Diese Java-Typen wissen sicher, was sie tun.”

    – Jake

    22. Februar 2012 um 21:05 Uhr

  • Kaum zu glauben, dass Java nicht zumindest einen Parameter “in diesem Verzeichnis starten …” hat …

    – Rogerpack

    31. Januar 2013 um 23:30 Uhr

  • Zur Verteidigung von Java (und ich bin ein UNIX-Typ, der sich diese Funktion wünscht) … es handelt sich um eine VM, die unabhängig von Betriebssystemspezifikationen sein soll. Das Idiom „aktuelles Arbeitsverzeichnis“ ist in einigen Betriebssystemen nicht verfügbar.

    – Toni K.

    20. Dezember 2013 um 4:56 Uhr


  • Um Java gegenüber fair zu sein, mussten sie es zuerst tun, C# hatte den Vorteil, dass sie in vielen Bereichen aus ihren Fehlern lernen konnten.

    – Ryan Leach

    21. Januar 2014 um 5:20 Uhr

  • @VolkerSeibt: Bei weiteren Untersuchungen scheint es, dass user.dir nur für einige Klassen funktioniert, einschließlich derjenigen, mit der ich zuerst getestet habe. new FileOutputStream("foo.txt").close(); erstellt die Datei im ursprünglichen Arbeitsverzeichnis, auch wenn user.dir vom Programm geändert wird.

    – Michael myers

    9. Juni 2015 um 17:13 Uhr

Wenn Sie Ihr Legacy-Programm mit ausführen ProcessBuilderkönnen Sie seine Funktionsweise angeben Verzeichnis.

  • Die Route von ist die Route, die ich genommen habe. Ich konnte eine ausführbare Datei aus einem anderen Arbeitsverzeichnis mit folgendem ausführen: File WorkingDir = new File(“C:\\path\\to\\working\\dir\\”); ProcessBuilder pBuilder = new ProcessBuilder(“C:\\path\\to\\working\\dir\\executable.exe”); pBuilder.directory (Arbeitsverzeichnis); Prozess p = pBuilder.start();

    – CatsAndCode

    9. Februar 2018 um 13:11 Uhr


Andern des aktuellen Arbeitsverzeichnisses in Java
Steve K

Dort ist eine Möglichkeit, dies mit der Systemeigenschaft “user.dir” zu tun. Der wichtigste Teil, den es zu verstehen gilt, ist, dass getAbsoluteFile() aufgerufen werden muss (wie unten gezeigt) oder relative Pfade gegen die aufgelöst werden Ursprünglich “user.dir”-Wert.

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");
    }
}

  • Das aktuelle Arbeitsverzeichnis wird jedoch nicht geändert. Nur der Wert von user.dir. Die Tatsache, dass der absolute Weg kritisch wird, beweist es.

    – Benutzer207421

    20. September 2017 um 6:13 Uhr


Andern des aktuellen Arbeitsverzeichnisses in Java
Allen Rohner

Es ist möglich, die PWD zu ändern, indem Sie JNA/JNI verwenden, um Aufrufe an libc zu tätigen. Die JRuby-Jungs haben eine praktische Java-Bibliothek für POSIX-Aufrufe aufgerufen jnr-posix. Hier ist die Maven-Info

1646392631 211 Andern des aktuellen Arbeitsverzeichnisses in Java
Bizmark

Wie bereits erwähnt, können Sie die CWD der JVM nicht ändern, aber wenn Sie einen anderen Prozess mit Runtime.exec() starten, können Sie die überladene Methode verwenden, mit der Sie das Arbeitsverzeichnis angeben können. Dies dient nicht wirklich dazu, Ihr Java-Programm in einem anderen Verzeichnis auszuführen, aber in vielen Fällen, wenn Sie ein anderes Programm wie beispielsweise ein Perl-Skript starten müssen, können Sie das Arbeitsverzeichnis dieses Skripts angeben, während Sie das Arbeitsverzeichnis der JVM unverändert lassen.

Sehen Runtime.exec Javadocs

Speziell,

public Process exec(String[] cmdarray,String[] envp, File dir) throws IOException

wo dir ist das Arbeitsverzeichnis, in dem der Unterprozess ausgeführt wird

  • Dies scheint eine bessere Antwort zu sein als die akzeptierte Antwort (die mit “Es gibt keine zuverlässige Möglichkeit, dies in reinem Java zu tun. “) beginnt. Gibt es eine Möglichkeit zu beantragen, dass diese Antwort als akzeptierte Antwort betrachtet wird?

    – John

    31. August 2015 um 20:06 Uhr

1646392631 493 Andern des aktuellen Arbeitsverzeichnisses in Java
Adam Paynter

Wenn ich das richtig verstehe, beginnt ein Java-Programm mit a Kopieren der aktuellen Umgebungsvariablen. Alle Änderungen über System.setProperty(String, String) ändern die Kopie, nicht die ursprünglichen Umgebungsvariablen. Nicht, dass dies einen gründlichen Grund dafür liefert, warum Sun dieses Verhalten gewählt hat, aber vielleicht bringt es ein wenig Licht ins Dunkel …

  • Dies scheint eine bessere Antwort zu sein als die akzeptierte Antwort (die mit “Es gibt keine zuverlässige Möglichkeit, dies in reinem Java zu tun. “) beginnt. Gibt es eine Möglichkeit zu beantragen, dass diese Antwort als akzeptierte Antwort betrachtet wird?

    – John

    31. August 2015 um 20:06 Uhr

Das Arbeitsverzeichnis ist eine Funktion des Betriebssystems (wird beim Start des Prozesses festgelegt). Warum übergeben Sie nicht einfach Ihre eigene Systemeigenschaft (-Dsomeprop=/my/path) und verwenden Sie das in Ihrem Code als übergeordnetes Element Ihrer Datei:

File f = new File ( System.getProperty("someprop"), myFilename)

  • Weil das Codestück einen fest codierten Dateipfad enthält und wahrscheinlich einen fest codierten Konstruktor verwendet, der das übergeordnete Verzeichnis nicht angibt, von dem aus gearbeitet werden soll. Das ist zumindest die Situation, die ich habe 🙂

    – David Mann

    5. März 2014 um 16:24 Uhr

934140cookie-checkÄndern des aktuellen Arbeitsverzeichnisses in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy