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.io
pakket oplossen relatieve pathnames met behulp van de huidige gebruikersdirectory. De huidige map wordt weergegeven als systeemobject, dat wil zeggen, user.dir
en 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.Path
en java.nio.file.Paths
kun 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.dir
moet 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 CodeSource
verkrijgen via ProtectionDomain#getCodeSource()
en het ProtectionDomain
kunnen 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"));
}
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.java
en u wilt afdrukken Tot c:\myApp\com\foo\src\service
DAN 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 Class
met main
zou worden genoemd MainClass
, probeer dan:
MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();
Hierdoor wordt een String
met 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 -D
en 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();