как прочитать текстовый файл с помощью scanner на Java?

#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")