Попытка создать новый файл вызывает исключение FileNotFoundException, но файл существует в том же пакете

У меня есть CSV-файл по тому же пути, что и все остальное. Теперь, когда я пытаюсь создать объект File:

public void getMenu() {

    File fileMenu = new File("FastFoodMenu.csv");

    try {
        Scanner inputStream = new Scanner(fileMenu);
        while (inputStream.hasNext()) {
            String data = inputStream.next();
            System.out.println(data);
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger(FileHandler.class.getName()).log(Level.SEVERE, null, ex);
    }

}

выкидывает FileNotFoundException.

абсолютный путь ко всем файлам в проекте:

C:\Users\kenyo\Documents\NetBeansProjects\OrderFastFood\src\fastfoodorderingsystem

Я тоже пару раз проверял имя. fileMenu.exists() возвращает false.

Укажите полный путь к вашему файлу.

Nicholas K 20.09.2018 11:09

Можете ли вы попробовать выполнить System.out.println(new File ("."). GetAbsolutePath () `, чтобы проверить рабочий каталог? Возможно, рабочий каталог вашего проекта не src/fastfoodorderingsystem.

jbx 20.09.2018 11:09
Trying to create a new file Где именно вы создаете новый файл?
Korashen 20.09.2018 11:11

попробуйте этот File fileMenu = new File("./src/fastfoodorderingsystem /FastFoodMenu.csv");

Nawnit Sen 20.09.2018 11:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
235
2

Ответы 2

Возможно, ваш CSV-файл находится не в том месте. Вы просто указываете имя файла, которое является относительным путем.

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

Чтобы решить проблему, вы можете

  • переместите файлы в реальный рабочий каталог.
  • используйте абсолютный путь (не рекомендуется!)
  • укажите папку с вашими файлами данных в качестве аргумента программы или в файле конфигурации (в вашем рабочем каталоге)
  • поместите файлы куда-нибудь в путь к классам вашего приложения и загрузить их оттуда через загрузчик классов. Обратите внимание, что файлы, которые находятся в вашем пути к классам, обычно упаковываются вместе с вашим приложением и, следовательно, не могут быть легко изменены пользователем, поэтому это решение не работает, если файл должен быть изменен пользователем.

Большое спасибо, перемещение файла в рабочий каталог (которым была папка проекта) решило проблему.

chris 20.09.2018 12:15

Если это решило вашу проблему, почему вы не отметили это как ответ?

Alex Couch 20.09.2018 12:22

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

Во-вторых, переместите файл FastFoodMenu.csv в эту папку меню. Относительный путь FastFoodMenu.csv теперь должен выглядеть так: OrderFastFood\menus\FastFoodMenu.csv.

В-третьих, получите свой рабочий каталог из свойств системы. Это папка, в которой работает ваша программа. Затем получите ссылку (объект File) на папку меню.

Наконец, получите ссылку на рассматриваемый файл внутри папки меню. Когда вы дойдете до многофайлового чтения (и в какой-то момент чтения из нескольких папок), вы захотите получить файлы внутри папки меню в виде списка, поэтому я говорю, чтобы просто получить папку меню как свою ссылка (или просто получите файл без изолированной ссылки на родительский объект, также известный как '\ menus \').

Итак, ваш код действительно должен выглядеть так:

public void getMenu() {
    final File workingDir = File(System.getProperty("user.dir"));
    final File menusDir = File(workingDir, "menus");
    final File fastFoodMenu = File(menusDir, "FastFoodMenu.csv");

    try {
        final FileInputStream fis = new FileInputStream(fastFoodMenu);
        final BufferedInputStream bs = new BufferedInputStream(fis);
        while((l = bs.readLine()) != null) {
            System.out.println(l);
        }
    } catch(FileNotFoundException e) {
        System.out.println(e.getMessage());
        e.printStackTrace()
    }
}

Это все псевдокод, но он должен, по крайней мере, помочь вам начать работу. Обязательно используйте BufferedInputStream для повышения эффективности и при чтении файлов всегда передавайте их в FileInputStream. Это намного лучше, чем использование класса Scanner. Я также должен упомянуть, что при создании объекта File вы на самом деле не создаете файл. Вы создаете объект, предоставляя ему данные, которые вы хотите, чтобы он имел (например, является ли это папкой, и если это так, то какие дочерние файлы / папки вы хотите, чтобы он имел, защищен ли он. или нет, скрытый или нет и т. д.), прежде чем фактически сообщать системе о создании файла со всем остальным.

Я думаю, здесь должно быть достаточно просто использовать относительные пути, поскольку они все равно будут разрешены относительно рабочего каталога. Поэтому нет необходимости запрашивать и добавлять системное свойство user.dir.

isnot2bad 20.09.2018 16:55

Надеюсь, вы не возражаете, но я отредактировал ваш код и удалил материал String.format в пользу более удобного конструктора File, который принимает родительский каталог в качестве первого аргумента.

isnot2bad 20.09.2018 17:00

Да, я совсем забыл об этой конструкции, спасибо! Я знал, что есть лучшее, что просто забыл. И я бы не стал полагаться на то, что пути разрешаются напрямую против работы. В прошлом у меня были проблемы с этим, поэтому я всегда пытаюсь получить свойство user.dir для страховки. Но все же есть над чем подумать!

Alex Couch 21.09.2018 00:33

Хорошо для всех, кто читает это, я хочу отметить свой комментарий выше. Это может быть немного сложно читать, но я был на мобильном телефоне, и моя клавиатура просто отстой. Он слишком исправляет вещи. Я пытался сказать, что забыл о конструкторе File (parent, path) (а не о конструкции). Не только это, но я пытался сказать, что мне не нравится, когда виртуальная машина или моя IDE разрешают пути к рабочему каталогу. Я бы предпочел сделать это вручную, чтобы точно знать, что он использует рабочий каталог. Просто для разъяснения lmao.

Alex Couch 25.09.2018 00:31

Другие вопросы по теме