Получение текущего рабочего каталога в Java
Я хочу получить доступ к текущему рабочему каталогу, используя
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);
OutPut:
Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32
Мой вывод неверен, потому что диск C не является моим текущим каталогом.
Нужна помощь в этом отношении.
Ответы
Ответ 1
public class JavaApplication1 {
public static void main(String[] args) {
System.out.println("Working Directory = " +
System.getProperty("user.dir"));
}
}
Здесь будет напечатан полный абсолютный путь , от которого было инициализировано ваше приложение.
Ответ 2
Смотрите: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html
Используя java.nio.file.Path
и java.nio.file.Paths
, вы можете сделать следующее, чтобы показать, что Java - это ваш текущий путь. Это для 7 и дальше, и использует NIO.
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);
Это выводит Current relative path is: /Users/george/NetBeansProjects/Tutorials
, что в моем случае я запускал класс. Построить пути относительно, не используя ведущий разделитель, чтобы указать, что вы строите абсолютный путь, будет использовать этот относительный путь как отправную точку.
Ответ 3
Ниже описаны работы на Java 7 и выше (см. здесь для документации).
import java.nio.file.Paths;
Paths.get(".").toAbsolutePath().normalize().toString();
Ответ 4
Это даст вам путь вашего текущего рабочего каталога:
Path path = FileSystems.getDefault().getPath(".");
И это даст вам путь к файлу с именем "Foo.txt" в рабочем каталоге:
Path path = FileSystems.getDefault().getPath("Foo.txt");
Изменить: Чтобы получить абсолютный путь к текущему каталогу:
Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
Ответ 5
Это решение для меня
File currentDir = new File("");
Ответ 6
Что заставляет вас думать, что c:\windows\system32 не является вашим текущим каталогом? Свойство user.dir
явно должно быть "текущим рабочим каталогом пользователя".
Другими словами, если вы не запускаете Java из командной строки, c:\windows\system32, вероятно, является вашим CWD. То есть, если вы дважды щелкнете, чтобы запустить свою программу, CWD вряд ли будет каталогом, из которого вы дважды щелкнете.
Редактировать: Похоже, что это верно только для старых версий Windows и/или Java.
Ответ 7
Используйте CodeSource#getLocation()
.
Это отлично работает и в JAR файлах. Вы можете получить CodeSource
ProtectionDomain#getCodeSource()
, а ProtectionDomain
в свою очередь можно получить с помощью 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());
}
}
Ответ 8
Я нашел это решение в комментариях, которое лучше других и более переносимо:
String cwd = new File("").getAbsolutePath();
Ответ 9
this.getClass().getClassLoader().getResource("").getPath()
Ответ 10
обычно, как объект File:
File getCwd() {
return new File("").getAbsoluteFile();
}
вам может потребоваться полная строка, например "D:/a/b/c":
getCwd().getAbsolutePath()
Ответ 11
Я нахожусь в Linux и получаю тот же результат для обоих этих подходов:
@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
Текущий рабочий каталог определяется по-разному в разных реализациях Java. Для определенной версии до Java 7 не было последовательного способа получить рабочий каталог. Вы можете обойти это, запустив файл Java с помощью -D
и определяя переменную для хранения информации
Что-то вроде
java -D com.mycompany.workingDir="%0"
Это не совсем правильно, но вы поняли эту идею. Тогда System.getProperty("com.mycompany.workingDir")
...
Ответ 13
Использование Windows user.dir возвращает каталог, как ожидалось, но НЕ, когда вы запускаете приложение с повышенными правами (запускаетесь как admin), в этом случае вы получаете C:\WINDOWS\system32
Ответ 14
В Linux, когда вы запустите файл jar из терминала, оба они вернут тот же String
: "/home/CurrentUser" , независимо от того, где находится файл jar jar. Это зависит только от того, какой текущий каталог вы используете с вашим терминалом, когда вы запускаете файл jar.
Paths.get("").toAbsolutePath().toString();
System.getProperty("user.dir");
Если ваш Class
с main
будет называться MainClass
, попробуйте:
MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();
Это вернет String
с абсолютным путем файла jar.
Ответ 15
Надеюсь, вы хотите получить доступ к текущему каталогу, включая пакет i.e. Если ваша программа Java находится в c:\myApp\com\foo\src\service\MyTest.java
и вы хотите печатать до c:\myApp\com\foo\src\service
, тогда вы можете попробовать следующий код:
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);
Примечание. Этот код тестируется только в Windows с Oracle JRE.
Ответ 16
Упомяните, что он проверяется только в Windows
, но я думаю, что он отлично работает на других операционных системах [Linux,MacOs,Solaris
]:).
У меня были файлы 2 .jar
в том же каталоге. Я хотел от одного файла .jar
запустить другой файл .jar
, который находится в том же каталоге.
Проблема заключается в том, что при запуске из cmd
текущий каталог system32
.
предупреждения!
- Ниже показано, что все работает хорошо во всех тестах, которые я сделал даже
с именем папки
;][[;'57f2g34g87-8+9-09!2#@!$%^^&()
или ()%&$%^@#
он работает хорошо.
- Я использую
ProcessBuilder
следующим образом:
🍂..
//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 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;
}
Ответ 17
Предположим, что вы пытаетесь запустить проект внутри eclipse или netbean или автономно из командной строки. Я написал метод для его исправления.
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());
}
}
Чтобы использовать, везде, где вы хотите получить базовый путь для чтения файла, вы можете передать свой класс привязки вышеприведенному методу, результат может быть то, что вам нужно: D
Бест,
Ответ 18
Ни один из ответов, размещенных здесь, не работал у меня. Вот что работало:
java.nio.file.Paths.get(
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);
Изменить: окончательная версия в моем коде:
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()
Ответ 19
Это зависит от контекста (веб-приложение или Jar)
1- Если вы запускаете проект как Jar
String cwd = new File("").getAbsolutePath();
System.out.println(cwd);
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println(s);
System.out.println(System.getProperty("user.dir"));
Они будут работать в jar-приложении, но не в веб-приложении.
Для веб-приложения вы должны использовать (допустим, что ActualClass является текущим классом, в котором вы работаете):
URL resource = ActualClass.class.getClassLoader().getResource(".");
System.out.println(resource.getPath());
Если у вас нет способа узнать контекст, то вам следует как-то предоставить, AFAIK. Надеюсь, это поможет.
Ответ 20
System.getProperty("java.class.path")
Ответ 21
это текущее имя каталога
String path="/home/prasad/Desktop/folderName";
File folder = new File(path);
String folderName=folder.getAbsoluteFile().getName();
это текущий путь к каталогу
String path=folder.getPath();