У меня есть 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.
Можете ли вы попробовать выполнить System.out.println(new
File ("."). GetAbsolutePath () `, чтобы проверить рабочий каталог? Возможно, рабочий каталог вашего проекта не src/fastfoodorderingsystem
.
Trying to create a new file
Где именно вы создаете новый файл?
попробуйте этот File fileMenu = new File("./src/fastfoodorderingsystem /FastFoodMenu.csv");
Возможно, ваш CSV-файл находится не в том месте. Вы просто указываете имя файла, которое является относительным путем.
Относительные пути всегда сопоставляются с рабочим каталогом вашего приложения, а не с каталогом, в котором находятся ваши исходные файлы.
Чтобы решить проблему, вы можете
Большое спасибо, перемещение файла в рабочий каталог (которым была папка проекта) решило проблему.
Если это решило вашу проблему, почему вы не отметили это как ответ?
Во-первых, в вашем корневом / рабочем каталоге (в вашем случае это папка, содержащая ваш проект) создайте папку под названием «меню», здесь вы можете хранить все свои меню (чтобы вы могли поиграть с многофайловым вводом).
Во-вторых, переместите файл 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
.
Надеюсь, вы не возражаете, но я отредактировал ваш код и удалил материал String.format
в пользу более удобного конструктора File
, который принимает родительский каталог в качестве первого аргумента.
Да, я совсем забыл об этой конструкции, спасибо! Я знал, что есть лучшее, что просто забыл. И я бы не стал полагаться на то, что пути разрешаются напрямую против работы. В прошлом у меня были проблемы с этим, поэтому я всегда пытаюсь получить свойство user.dir для страховки. Но все же есть над чем подумать!
Хорошо для всех, кто читает это, я хочу отметить свой комментарий выше. Это может быть немного сложно читать, но я был на мобильном телефоне, и моя клавиатура просто отстой. Он слишком исправляет вещи. Я пытался сказать, что забыл о конструкторе File (parent, path) (а не о конструкции). Не только это, но я пытался сказать, что мне не нравится, когда виртуальная машина или моя IDE разрешают пути к рабочему каталогу. Я бы предпочел сделать это вручную, чтобы точно знать, что он использует рабочий каталог. Просто для разъяснения lmao.
Укажите полный путь к вашему файлу.