Java, использующая относительный путь вместо абсолютного пути

#java #relative-path #readfile

#java #относительный путь #readfile

Вопрос:

Я читаю в файле на Java, и когда я использую абсолютный путь, он работает нормально.

 File myObj = new File("/Users/aaronmk2/Downloads/demo2/SystemDependencies/src/sample_input.txt");
  

Однако, когда я пытаюсь использовать относительный путь, я получаю ошибку «Нет такого файла или каталога»

 File myObj = new File("../sample_input.txt");
  

Когда я использую свой терминал и использую nano ../sample_input.txt , он открывает файл.

Что мне нужно добавить, чтобы заставить относительный путь работать?

Комментарии:

1. Что такое cwd и classpath во время выполнения? Как вы выполняете программу?

Ответ №1:

Java отлично справляется с относительными путями. Очевидно, что «текущий рабочий каталог» для вашего Java-процесса не совпадает с cwd при вызове nano .

Вы можете проверить CWD в Java. Любой способ будет работать:

 System.out.println(new File(".").getAbsolutePath());
  

или:

 System.out.println(System.getProperty("user.dir"));
  

Вы должны обнаружить, что это другое. ‘cwd’ для процесса Java — это cwd, на который он был установлен тем, кто запустил java. Если вы вызываете java из командной строки, это будет каталог, в котором вы находитесь при этом. Если вы дважды щелкнете по jar, это будет каталог, в котором находится jar. Если вы создаете ярлык Windows, это каталог, указанный в ярлыке. Пример:

 cd /foo/bar
java -jar /bar/baz/hello.jar
  

В приведенном выше примере cwd является /foo/bar . Нет /bar/baz .

Комментарии:

1. Спасибо, мне нужно было добавить src / перед именем файла

2. Обратите внимание, что это означает, что он не будет работать при сборке вашего кода (очевидно, что после сборки нет ‘src’). Если это данные только для чтения, файл должен быть загружен с помощью ClassYouAreIn.class.getResourceAsStream(«file.txt «), помещая ‘file.txt ‘ в том же месте, что и ClassYoUAreIn.class . Если вы используете maven, поместите файл в src / resources точно так же, как ваши файлы src находятся в src / java. Если вы используете другую систему сборки, посмотрите, как это сделать. Это означает, что данные также будут считываться, когда они находятся в jar. Если это редактируемый файл, он не должен быть с кодом, он должен быть, например, в ~.