Почему File.exists() не работает

У меня есть файл watstheday.txt в папке src/main/resources моего проекта, как показано в файле изображения ниже.

введите здесь описание изображения

Я читаю файл с помощью метода getResourceAsStream() метода ClassLoader и выполняю дальнейшие действия в своем коде, который работает отлично. Однако, если я попытаюсь проверить, существует ли файл с помощью приведенного ниже кода, он всегда возвращает false.

try {
            ClassLoader classLoader = getClass().getClassLoader();
            System.out.println("!@#!@# so difficult to be simple..."+classLoader.getResource("watstheday.txt"));
            //this returns false but the file is there
            System.out.println("@#@ vertigo2 "+new File(classLoader.getResource("watstheday.txt").getFile()).isFile());
            //this ALSO returns false but the file is there
            System.out.println("@#@ vertigo2 "+new File(classLoader.getResource("watstheday.txt").getFile()).exists());
            //Giving the / to mark the root of the application though that's not required
            System.out.println("@#@ vertigo3 "+new File(classLoader.getResource("//watstheday.txt").getFile()).isFile());
            //the below code with getResourceAsStream works absolutely fine and i can read the file
            classLoader.getResourceAsStream("watstheday.txt");
            BufferedReader buf = new BufferedReader(
                    new InputStreamReader(classLoader.getResourceAsStream("watstheday.txt")));
            while (true) {
                lineJustFetched = buf.readLine();
                System.out.println(" @@#@ lineJustFetched =" + lineJustFetched);
            }
            buf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

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

!@#!@# so difficult to be simple... vfs=$my_server_deployment_folder_location$/helloworld/watstheday.txt

person raikumardipak    schedule 19.02.2018    source источник
comment
Возможно ли, что ваш файл существует в zip-файле?   -  person Paras    schedule 19.02.2018
comment
к вашему сведению, я проверил ваш код на своем Eclipse и получил @#@ vertigo2 true @#@ vertigo2 true   -  person Evgeniy Dorofeev    schedule 19.02.2018
comment
Прочитайте этот пост, это объясняет, почему getResource(...).getFile() не возвращает что-то, что вы можете передать конструктору java.io.File, потому что это не одно и то же: В чем разница между ресурсом, URI, URL, путем и файлом в Java?   -  person Erwin Bolwidt    schedule 19.02.2018
comment
File.exists() вернет true, если ваш файл физически существует как сущность. Он всегда возвращает false в виртуальной файловой системе.   -  person Paras    schedule 19.02.2018
comment
@EvgeniyDorofeev я неоднократно пытался, но это не так для меня. Я не вижу собственной глупости, ????   -  person raikumardipak    schedule 19.02.2018
comment
@Paras файл не является zip-файлом, и когда я печатаю путь к файлу, он печатается правильно, что я перепроверил на сервере развертывания и нашел его правильным   -  person raikumardipak    schedule 19.02.2018
comment
@EvgeniyDorofeev ты используешь систему Windows?   -  person raikumardipak    schedule 19.02.2018
comment
@EvgeniyDorofeev Файл существует в vfs, как упоминал Парас, поэтому exists() или isFile() возвращают мне false. Я думаю, вы, должно быть, попробовали это в отдельном основном приложении, и тогда оно вернет true.   -  person raikumardipak    schedule 21.02.2018


Ответы (1)


Ресурсы - это не файлы. Когда вы разрабатываете (скажем, в IDE) и еще не упаковали приложение, вы можете получить пути к реальным файлам (где-то в src/main/resources).

Однако когда приложение упаковано, ресурсы представляют собой записи в архиве. Они больше не существуют в виде файлов. Так что не используйте File с ресурсами.

person lexicore    schedule 19.02.2018
comment
файл, используемый в качестве ресурса, является довольно распространенным вариантом использования. в моем случае я сохранил файл в папке ресурсов, как говорит maven, и я могу получить доступ к файлу для моей операции чтения через getResourceAsStream(). Только classLoader.getResource(watstheday.txt).getFile()).exists() не работает! - person raikumardipak; 19.02.2018
comment
Я писал об использовании ресурса как файла, а не файла как ресурса. - person lexicore; 19.02.2018