Hoe de huidige werkmap in Java te krijgen?

Ik wil toegang tot mijn huidige werkdirectory met Java.

Mijn code:

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

Uitgang:

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

Mijn uitvoer is niet correct omdat de C-drive niet mijn huidige map is.

Hoe de huidige map te krijgen?


1, Autoriteit 100%

code:

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

Hiermee drukt u het absolute pad van de huidige map af van waaruit uw aanvraag is geïnitialiseerd.


Uitleg:

van de documentatie :

java.iopakket oplossen relatieve pathnames met behulp van de huidige gebruikersdirectory. De huidige map wordt weergegeven als systeemobject, dat wil zeggen, user.diren is de map van waaruit de JVM is aangeroepen.


2, Autoriteit 33%

Zie: pad-operaties (The Java ™ Tutorials & GT; Essential Classes & GT ; Basis I / O) .

Met java.nio.file.Pathen java.nio.file.Pathskun je het volgende doen om te laten zien wat volgens Java je huidige pad is. Dit voor 7 en verder, en gebruikt NIO.

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

Dit levert het volgende op:

Current relative path is: /Users/george/NetBeansProjects/Tutorials

dat is in mijn geval de plek waar ik de klas leidde.

Als u paden op een relatieve manier construeert, door geen voorloopscheidingsteken te gebruiken om aan te geven dat u een absoluut pad construeert, wordt dit relatieve pad als startpunt gebruikt.


Antwoord 3, autoriteit 19%

Het volgende werkt op Java 7 en hoger (zie hiervoor documentatie).

import java.nio.file.Paths;
Paths.get(".").toAbsolutePath().normalize().toString();

Antwoord 4, autoriteit 6%

Dit geeft je het pad van je huidige werkmap:

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

En dit geeft je het pad naar een bestand genaamd “Foo.txt” in de werkdirectory:

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

Bewerken:
Om een absoluut pad van de huidige map te verkrijgen:

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

* Bijwerken *
Om de huidige werkmap te krijgen:

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

Antwoord 5, autoriteit 4%

Java 11 en nieuwer

Deze oplossing is beter dan andere en draagbaarder:

Path cwd = Path.of("").toAbsolutePath();

Of zelfs

String cwd = Path.of("").toAbsolutePath().toString();

Antwoord 6, autoriteit 3%

Dit is de oplossing voor mij

File currentDir = new File("");

Antwoord 7, autoriteit 2%

Waarom denk je dat c:\windows\system32niet je huidige directory is? De user.dirmoet expliciet “de huidige werkmap van de gebruiker” zijn.

Om het anders te zeggen, tenzij u Java vanaf de opdrachtregel start, is c:\windows\system32waarschijnlijk uw CWD. Dat wil zeggen, als u dubbelklikt om uw programma te starten, is het onwaarschijnlijk dat de CWD de map is van waaruit u dubbelklikt.

Bewerken: het lijkt erop dat dit alleen geldt voor oude Windows- en/of Java-versies.


Antwoord 8, autoriteit 2%

Gebruik CodeSource#getLocation().

Dit werkt ook prima in JAR-bestanden. U kunt CodeSourceverkrijgen via ProtectionDomain#getCodeSource()en het ProtectionDomainkunnen op hun beurt worden verkregen door Class#getProtectionDomain().

public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}

Antwoord 9, autoriteit 2%

this.getClass().getClassLoader().getResource("").getPath()

Antwoord 10

in het algemeen als een File-object:

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

misschien wilt u een volledig gekwalificeerde tekenreeks zoals “D:/a/b/c” doen:

getCwd().getAbsolutePath()

Antwoord 11

Ik gebruik Linux en krijg hetzelfde resultaat voor beide benaderingen:

@Test
public void aaa()
{
    System.err.println(Paths.get("").toAbsolutePath().toString());
    System.err.println(System.getProperty("user.dir"));
}

Paths.get("")docs

System.getProperty("user.dir")DOCS


12

Ik hoop dat u de huidige map wilt openen, inclusief het pakket, dwz als uw Java-programma is in c:\myApp\com\foo\src\service\MyTest.javaen u wilt afdrukken Tot c:\myApp\com\foo\src\serviceDAN U kunt de volgende code proberen:

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

Opmerking: Deze code wordt alleen getest in Windows met Oracle JRE.


13

Op Linux Wanneer u een JAR -bestand uitvoert van Terminal , zullen deze beide hetzelfde retourneren String: “/ Home / Currentuser” , ongeacht, waar uw JAR-bestand is. Het hangt af van welke huidige map gebruikt u bij uw terminal, wanneer u het JAR-bestand start.

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

Als uw Classmet mainzou worden genoemd MainClass, probeer dan:

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

Hierdoor wordt een Stringmet absoluut pad van het jar bestand.


14

Gebruik van Windows User.dir Retourneert de map als verwacht, maar niet wanneer u uw aanvraag start met verhoogde rechten (uitgevoerd als admin), krijgt u in dat geval C: \ Windows \ System32


Antwoord 15

neem aan dat u uw project probeert uit te voeren binnen eclipse, of netbean of stand-alone vanaf de opdrachtregel. Ik heb een methode geschreven om het op te lossen

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

Om te gebruiken, overal waar je het basispad wilt krijgen om het bestand te lezen, kun je je ankerklasse doorgeven aan de bovenstaande methode, het resultaat kan zijn wat je nodig hebt:D

Beste,


Antwoord 16

De huidige werkdirectory is anders gedefinieerd in verschillende Java-implementaties. Voor bepaalde versies vóór Java 7 was er geen consistente manier om de werkdirectory te krijgen. U kunt dit omzeilen door een Java-bestand te starten met -Den een variabele te definiëren om de info vast te houden

Zoiets als

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

Dat klopt niet helemaal, maar je snapt het idee. Dan System.getProperty("com.mycompany.workingDir")


Antwoord 17

Dit is mijn zilveren kogel wanneer er ooit een moment van verwarring borrelt. (Noem het als eerste ding in het algemeen). Misschien is JVM bijvoorbeeld verschoven naar een andere versie van IDE. Deze statische functie doorzoekt de huidige proces-PID en opent VisualVM op die pid. Verwarring stopt daar, want je wilt alles en je krijgt het…

 public static void callJVisualVM() {
    System.out.println("USER:DIR!:" + System.getProperty("user.dir"));
    //next search current jdk/jre
    String jre_root = null;
    String start = "vir";
    try {
        java.lang.management.RuntimeMXBean runtime =
                java.lang.management.ManagementFactory.getRuntimeMXBean();
        String jvmName = runtime.getName();
        System.out.println("JVM Name = " + jvmName);
        long pid = Long.valueOf(jvmName.split("@")[0]);
        System.out.println("JVM PID  = " + pid);
        Runtime thisRun = Runtime.getRuntime();
        jre_root = System.getProperty("java.home");
        System.out.println("jre_root:" + jre_root);
        start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid);
        thisRun.exec(start);
    } catch (Exception e) {
        System.getProperties().list(System.out);
        e.printStackTrace();
    }
}

Antwoord 18

Dit is niet precies wat er wordt gevraagd, maar hier is een belangrijke opmerking: wanneer Java op een Windows-machine wordt uitgevoerd, plaatst het Oracle-installatieprogramma een “java.exe” in C:\Windows\system32, en dit is wat fungeert als de launcher voor de Java-toepassing (TENZIJ er een java.exe eerder in het PATH staat en de Java-app vanaf de opdrachtregel wordt uitgevoerd). Dit is de reden waarom File(“.”) C:\Windows\system32 blijft retourneren, enwaarom het uitvoeren van voorbeelden van macOS- of *nix-implementaties steeds terugkomt met verschillende resultaten van Windows.

Helaas is er echt geen universeel correct antwoord op deze, voor zover ik in twintig jaar Java-codering heb gevonden, tenzij je je eigen native launcher wilt maken die uitvoerbaar is met JNI Invocation, en de huidige werkdirectory van de native launcher-code wanneer deze wordt gestart. Al het andere zal op zijn minst enige nuance hebben die in bepaalde situaties zou kunnen breken.


Antwoord 19

Probeer zoiets als dit. Ik weet dat ik te laat ben voor het antwoord, maar dit voor de hand liggende gebeurde in java8, een nieuwe versie van waaruit deze vraag wordt gesteld, maar…

De code

import java.io.File;
public class Find_this_dir {
    public static void main(String[] args) {
//some sort of a bug in java path is correct but file dose not exist
        File this_dir = new File("");
//but these both commands work too to get current dir        
//      File this_dir_2 = new File(this_dir.getAbsolutePath());
        File this_dir_2 = new File(new File("").getAbsolutePath());
        System.out.println("new File(" + "\"\"" + ")");
        System.out.println(this_dir.getAbsolutePath());
        System.out.println(this_dir.exists());
        System.out.println("");
        System.out.println("new File(" + "new File(" + "\"\"" + ").getAbsolutePath()" + ")");
        System.out.println(this_dir_2.getAbsolutePath());
        System.out.println(this_dir_2.exists());
    }
}

Dit zal werken en je het huidige pad tonen, maar ik begrijp nu niet waarom Java de huidige map niet kan vinden in new File("");bovendien gebruik ik Java8-compiler…

Dit werkt prima. Ik heb het zelfs getest new File(new File("").getAbsolutePath());

Je hebt nu de huidige map in een File-object, dus (voorbeeld bestandsobject is f dan),

f.getAbsolutePath()geeft je het pad in een string-variabel type…

Getest in een andere map die niet station C is, werkt prima


Antwoord 20

Voor Java 11 kunt u ook het volgende gebruiken:

var path = Path.of(".").toRealPath();

Antwoord 21

Mijn favoriete methode is om het uit de systeemomgevingsvariabelen te halen die aan het huidige lopende proces zijn gekoppeld. In dit geval wordt uw applicatie beheerd door de JVM.

String currentDir = System.getenv("PWD");
/*
 /home/$User/Documents/java
*/

Om andere omgevingvariabelen te bekijken die u misschien nuttig vindt, zoals Home Dir, OS-versie ……..

//Home directory
String HomeDir = System.getEnv("HOME");
//Outputs for unix
/home/$USER
//Device user
String user = System.getEnv("USERNAME");
//Outputs for unix
$USER

Het mooie met deze aanpak is dat alle paden worden opgelost voor alle soorten OS-platform


22

Geen van de hier gepost antwoorden werkte voor mij. Hier is wat werkte:

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

EDIT: de definitieve versie in mijn code:

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()

23

System.getProperty("java.class.path")


24

Dit is de huidige mapnaam

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

Dit is de huidige directorypad

String path=folder.getPath();

Other episodes