#java #java.util.scanner
#java #java.util.scanner
Вопрос:
Это мой код для чтения текстового файла. Когда я запускаю этот код, на выходе продолжает отображаться «Файл не найден.», что является сообщением FileNotFoundException
. Я не уверен, в чем проблема в этом коде.
По-видимому, это часть java. Для всего файла Java требуется, чтобы пользователь что-то ввел и создаст текстовый файл, используя входные данные в качестве имени. После этого пользователь должен снова ввести имя текстового файла, созданного ранее (предположим, что пользователь вводит правильно), а затем программа должна прочитать текстовый файл. Я правильно выполнил другие части своей программы, но проблема в том, что когда я снова ввожу имя, он просто не может найти текстовый файл, хотя они находятся в одной папке.
public static ArrayList<DogShop> readFile()
{
try
{ // The name of the file which we will read from
String filename = "a.txt";
// Prepare to read from the file, using a Scanner object
File file = new File(filename);
Scanner in = new Scanner(file);
ArrayList<DogShop> shops = new ArrayList<DogShop>();
// Read each line until end of file is reached
while (in.hasNextLine())
{
// Read an entire line, which contains all the details for 1 account
String line = in.nextLine();
// Make a Scanner object to break up this line into parts
Scanner lineBreaker = new Scanner(line);
// 1st part is the account number
try
{ int shopNumber = lineBreaker.nextInt();
// 2nd part is the full name of the owner of the account
String owner = lineBreaker.next();
// 3rd part is the amount of money, but this includes the dollar sign
String equityWithDollarSign = lineBreaker.next();
int total = lineBreaker.nextInt();
// Get rid of the dollar sign;
// we use the subtring method from the String class (see the Java API),
// which returns a new string with the first 'n' characters chopped off,
// where 'n' is the parameter that you give it
String equityWithoutDollarSign = equityWithDollarSign.substring(1);
// Convert this balance into a double, we need this because the deposit method
// in the Account class needs a double, not a String
double equity = Double.parseDouble(equityWithoutDollarSign);
// Create an Account belonging to the owner we found in the file
DogShop s = new DogShop(owner);
// Put money into the account according to the amount of money we found in the file
s.getMoney(equity);
s.getDogs(total);
// Put the Account into the ArrayList
shops.add(s);
}
catch (InputMismatchException e)
{
System.out.println("File not found1.");
}
catch (NoSuchElementException e)
{
System.out.println("File not found2");
}
}
}
catch (FileNotFoundException e)
{
System.out.println("File not found");
} // Make an ArrayList to store all the accounts we will make
// Return the ArrayList containing all the accounts we made
return shops;
}
Комментарии:
1. У вас есть файл «a.txt «в вашем рабочем каталоге?
2. Распечатайте System.getProperty(«user.dir»). Именно здесь ваша программа ожидает найти файл «a.out», поскольку вы не используете абсолютные пути.
Ответ №1:
Если вы работаете в какой-либо IDE, такой как Eclipse или NetBeans, у вас должен быть этот a.txt
файл в корневом каталоге вашего проекта. (и не в папке, в которую собраны ваши .class
файлы, или где-либо еще)
Если нет, вы должны указать абсолютный путь к этому файлу.
Редактировать:
Вы бы поместили .txt
файл в то же место, что и .class
(обычно также .java
файл, потому что вы компилируете в той же папке) скомпилированные файлы, если вы компилируете его вручную с помощью javac
. Это потому, что он использует относительный путь, а путь указывает JVM путь, по которому находится исполняемый файл.
Если вы используете какую-либо среду IDE, она сгенерирует для вас скомпилированные файлы с помощью Makefile или чего-то подобного для Windows и будет учитывать структуру файла по умолчанию, поэтому он знает, что относительный путь начинается с корневой папки проекта.
Комментарии:
1. но что сказал мне мой преподаватель, поместите текстовый файл в ту же папку, что и файл java
2. Отредактировал мой ответ. Надеюсь, это поможет.
Ответ №2:
Что ж.. По-видимому, файл не существует или не может быть найден. Попробуйте использовать полный путь. Вероятно, вы читаете не из того каталога, когда не указываете путь, если только a.txt находится в вашем текущем рабочем каталоге.
Ответ №3:
Я бы рекомендовал загрузить файл в качестве ресурса и преобразовать входной поток в строку. Это дало бы вам гибкость при загрузке файла в любом месте относительно пути к классу
Ответ №4:
Если вы дадите объекту Scanner строку, он будет считывать ее как данные. То есть, «a.txt «не открывается файл с именем»a.txt «. Он буквально считывает символы ‘a’, ‘.’, ‘t’ и так далее.
Это соответствует основному тому I Java, раздел 3.7.3.
Если я найду решение для чтения фактических путей, я вернусь и обновлю этот ответ. Решение, предлагаемое в этом тексте, заключается в использовании
Scanner in = new Scanner(Paths.get("myfile.txt"));
Но я не могу заставить это работать, потому что компилятор не распознает Path как переменную. Возможно, я пропускаю инструкцию import.
Ответ №5:
Это должно вам помочь..:
import java.io.*;
import static java.lang.System.*;
/**
* Write a description of class InRead here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class InRead
{
public InRead(String Recipe)
{
find(Recipe);
}
public void find(String Name){
String newRecipe= Name ".txt";
try{
FileReader fr= new FileReader(newRecipe);
BufferedReader br= new BufferedReader(fr);
String str;
while ((str=br.readLine()) != null){
out.println(str "n");
}
br.close();
}catch (IOException e){
out.println("File Not Found!");
}
}
}
Комментарии:
1. Это не обязательно должен быть рецепт, но это может быть что угодно другое. выбор за вами
Ответ №6:
Просто еще одна вещь… Вместо System.out.println("Error Message Here")
используйте System.err.println("Error Message Here")
. Это позволит вам различать ошибки и нормальное функционирование кода, отображая ошибки (т. е. все, что внутри System.err.println()
) красным цветом.
ПРИМЕЧАНИЕ: Это также работает при использовании с System.err.print("Error Message Here")