Java путь к файлу f.exists () всегда возвращает false - PullRequest
0 голосов
/ 06 мая 2020

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

Я хочу, чтобы все это происходило в папке внутри my проект (изображение прилагается), поэтому у меня есть некоторые сомнения ...

Это будет мое дерево проектов

  1. Папка "Test "правильно размещены?" если нет, как мне получить к нему доступ? Как видите, он находится внутри com.company, следует ли мне переместить его на sr c?

  2. Когда я пытаюсь проверить, существует ли он, он говорит false .

Это мой код:

public class Main {
    Scanner input = new Scanner(System.in);

    public static void main(String[] args) {
        Main main = new Main();
        main.init();
    }

    public void init(){
        File f = new File("Test"); //Here i've tried "com"+File.separator+"company"+File.separator+"Test"
        System.out.println(f.exists()); //output is false here

    }
}

f.getParent () говорит null.

Но когда я пытаюсь: System.out.println (f.getAbsolutePath ()); он правильно показывает весь путь.

Смысл использования относительного пути в том, что я хочу, чтобы этот код работал на ЛЮБОМ компьютере.

Спасибо за совет, надеюсь, кто-то может мне немного помочь .

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Если вы используете относительные пути в Java, они будут разрешены относительно рабочего каталога запущенного приложения. Итак, вам нужно знать, какой будет рабочий каталог.

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

Следует также отметить, что папка src, которую вы видите, является особенной. Записи в нем обычно не являются файлами и каталогами. Обычно это Java пакетов и классов. Таким образом, в файловой системе «sr c»> «com.company»> «Main» фактически представлен как файл с путем «src / com / company / Main. java».

Это означает, что помещать произвольные папки и файлы в папку «sr c» неправильно. Это будет работать ... но концептуально неверно. Файлы данных не принадлежат дереву исходных текстов, и уж тем более файлам данных, написанным вашим приложением. (И когда вы начнете использовать систему управления версиями, вы обнаружите, что запись файлов данных в исходное дерево вызовет у вас головную боль. Я не буду go вдаваться в подробности ... но я почти уверен, что вы будет пожалеть об этом.)

Другая вещь, которая концептуально неверна в том, что вы делаете, - это то, что Java программы обычно написаны как отдельные вещи. Пользователю вашей программы не нужно загружать и устанавливать Intellij или другую IDE и загружать в нее ваш проект. Они захотят просто запустить его из файла JAR. В этом мире каталог проекта и папка «sr c» не будут существовать, и жесткие относительные пути, такие как «src / Test», будут проблематичными. c.


Так что давайте игнорировать это пока и посмотрите, что ваш код в настоящее время делает

Правильно ли размещена папка «Test»? если нет, как мне получить к нему доступ? Как видите, он находится внутри com.company, следует ли мне переместить его в sr c?

Согласно изображению, папка Test (фактически пакет) >> находится << в папке <code>src Папка.

Когда я пытаюсь проверить, существует ли, появляется сообщение false.

Ваш код использует неправильный путь. Если папка «Test» находится там, где она у вас есть (как показано на рисунке!), Относительный путь должен быть «src / Test», а не «Test» или «com / company / Test».

Обратите внимание, что Windows принимает либо «/», либо «\» будет работать как разделитель файлов, даже если «\» - это то, что используется обычно.

f.getParent() говорит null.

Это правильно. Относительный путь «Тест» не имеет родительской части. Это простое имя файла / каталога.

Подумайте об этом так. Пока File с относительным путем не будет разрешено , не определено, к какому каталогу он относится.

Но когда я пытаюсь: System.out.println(f.getAbsolutePath()); он показывает правильно весь путь.

Опять же, правильно.

Когда вы вызываете f.getAbsolutePath() на относительном File, система времени выполнения добавляет путь к рабочему каталогу приложения, а затем дает вы получите результат.


Смысл использования относительного пути заключается в том, что я хочу, чтобы этот код работал на ЛЮБОМ компьютере.

Этот относительный путь НЕ БУДЕТ работать на ЛЮБОМ компьютере. Вы используете путь в дереве src вашего проекта, и ваш проект обычно не существует на компьютере конечного пользователя. (См. Выше.)

Итак, что вам делать?

Нет единственного правильного ответа.

  • Вы можете поместить файл / каталог в папку пользователя текущий / рабочий каталог.
  • Вы можете поместить файл / каталог в пользовательский домашний каталог или скрытый подкаталог в домашнем каталоге. (Это общий подход для Linux.)
  • Вы можете сделать путь к каталогу аргументом командной строки
  • Вы можете получить путь из переменной среды
  • Путь можно получить из файла конфигурации c приложения.

Лучший ответ будет зависеть от контекста.

0 голосов
/ 06 мая 2020

Согласно вашему изображению, путь неверен, вы должны проверить в каталоге sr c:

File f = new File("src/Test");
System.out.println(f.exists());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...