Получить файл по относительному пути в Windows

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

File initialFile = new File("D:\\Demo\\src\\test\\java\\com\\pro\\mockfiles\\My-DOC-FILE.doc");
InputStream uploadStream = new FileInputStream(initialFile);

работает нормально, но

File initialFile = new File("test/java/com/pro/mockfiles/My-DOC-FILE.doc");
InputStream uploadStream = new FileInputStream(initialFile);

выдает следующую ошибку

java.io.FileNotFoundException: test\java\com\pro\mockfiles\My-DOC-FILE.doc (The system cannot find the path specified)

Я хочу запустить с относительным путем, вы можете помочь?


person Netra    schedule 03.12.2018    source источник
comment
Java работает с относительными путями; проверь ДВД!   -  person MrTux    schedule 03.12.2018
comment
Вы можете использовать File.separatorChar вместо / или \   -  person BishalG    schedule 03.12.2018
comment
относительно чего? где ваши файлы классов?   -  person Scary Wombat    schedule 03.12.2018
comment
относительный путь к моему файлу документа, который находится в отдельном каталоге в моем проекте @ScaryWombat   -  person Netra    schedule 03.12.2018
comment
не могли бы вы рассказать больше о File.separatorChar @BishalGautam   -  person Netra    schedule 03.12.2018
comment
Спасибо, я уже знаю это, но я все еще получаю эту ошибку, я хочу знать основную причину. @MrTux   -  person Netra    schedule 03.12.2018
comment
Вы можете прочитать об этом здесь: journaldev.com/851/< /а>   -  person BishalG    schedule 03.12.2018
comment
Вы делаете серьезную ошибку в мышлении. Относительный путь всегда является относительным от рабочего каталога. Это каталог, в котором выполняется приложение, а не тот, в котором оно хранится. Итак, чтобы выяснить, какой относительный путь использовать, вам сначала нужно выяснить, что такое текущий рабочий каталог. Вы можете сделать это, выполнив: Paths.get().toAbsolutePath().toString()   -  person Gerben Jongerius    schedule 03.12.2018


Ответы (3)


Здесь другое решение, как получить каталог, приложение был начат в:

String current_dir = System.getProperty("user.dir");

После этого можно построить абсолютный путь к .doc, используя текущий рабочий каталог:

Paths.get(current_dir, "test/java/com/pro/mockfiles/My-DOC-FILE.doc");

с Paths.get(...)< /а>

person awgold90    schedule 03.12.2018

Хотя относительные пути могут работать в Java, лично я бы не рекомендовал их использовать. Средняя причина в том, что «относительный» путь к файлу меняется в зависимости от рабочего каталога Java. Если вы запускаете приложение из «c:\tmp», тогда относительный путь будет другим, чем при запуске из «c:\test». Даже если приложение находится в «c:\myApp».

Но если вы хотите использовать его, сначала выясните, откуда были запущены ваши приложения (называемые рабочим каталогом), выполнив следующий код:

 System.out.println(Paths.get("").toAbsolutePath().toString());

После этого измените относительный путь в соответствии с разницей между рабочим каталогом и нужным файлом.

В качестве примечания я заметил, что файл хранится в пути к классам. Таким образом, вы можете заглянуть в ClassLoader, чтобы получить доступ к файлу, а не использовать файловую систему. Вы можете сделать это (в случае, если код выполняется в тесте) с помощью следующего кода:

MyClass.class.getClassLoader().getResourceAsStream("/com/pro/mockfiles/My-DOC-FILE.doc");

Этот код более надежен, поскольку он будет работать независимо от того, откуда запускается приложение.

person Gerben Jongerius    schedule 03.12.2018
comment
Иногда ожидается именно ваше описанное поведение, например. если пользователь указывает относительный путь. - person MrTux; 03.12.2018
comment
Спасибо Гербен за объяснение - person Netra; 03.12.2018

Кажется, что вы запускаете свое приложение на любом сервере.
Поэтому, когда вы запускаете его на сервере, приложение будет использовать путь относительно корневого каталога этого сервера (может быть /bin или что-то еще, в зависимости от вашего сервера).
Когда вы запускаете его как отдельную Java-программу, она занимает путь относительно того места, где выполняется отдельная программа.
Поэтому, если вы хотите запустить ее на сервере, укажите путь относительно корневого каталога сервера.
Например:-
File initialFile = new File("<Path after Server root>/test/java/com/pro/mockfiles/My-DOC-FILE.doc");

<Server root> может быть путем после C:/Myserver/bin

person Tarun    schedule 03.12.2018