web-dev-qa-db-ja.com

Javaのスキャナーを使用してテキストファイルを読み取る方法

これは、テキストファイルを読み取るための私のコードです。このコードを実行すると、出力はFileNotFoundExceptionのメッセージである「File not found。」と言い続けます。このコードの問題点はわかりません。

どうやらこれは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;
    }
9
user764073

まあ..どうやらファイルが存在しないか、見つかりません。フルパスを使用してみてください。パスを指定しないと、おそらくa.txtが現在の作業ディレクトリにない限り、間違ったディレクトリから読み取っています。

4
GolezTrol

EclipseやNetBeansのような一部のIDEで作業している場合は、a.txtファイルは、プロジェクトのルートディレクトリにあります。 (および.classファイルはビルドされているか、他の場所にあります)

そうでない場合は、そのファイルへの絶対パスを指定する必要があります。


編集:
あなたは.txtファイルと同じ場所に.class(通常は.Javaファイルは、同じフォルダでコンパイルするため)javacを使用して手動でコンパイルする場合はコンパイル済みファイルです。これは、相対パスを使用し、そのパスが実行可能ファイルのあるパスをJVMに伝えるためです。

IDEを使用する場合、MakefileまたはWindowsに類似したものを使用してコンパイルされたファイルを生成し、デフォルトのファイル構造であると見なします。そのため、相対パスはプロジェクトのルートフォルダーから始まることがわかります。

4
Iulius Curt

ちょうど別のこと... System.out.println("Error Message Here")の代わりに、System.err.println("Error Message Here")を使用します。これにより、エラー(つまり、System.err.println()内のすべて)を赤で表示することで、エラーと通常のコード機能の違いを区別できます。

[〜#〜] note [〜#〜]System.err.print("Error Message Here")とともに使用した場合にも機能します

0
JavaBoss

Scannerオブジェクトに文字列を指定すると、データとして読み込まれます。つまり、「a.txt」は「a.txt」というファイルを開きません。文字通り「a」、「。」、「t」などを読み取ります。

これは、Core Java Volume I、セクション3.7.3。

実際のパスを読み取るための解決策を見つけた場合は、この回答に戻って更新します。このテキストが提供する解決策は使用することです

Scanner in = new Scanner(Paths.get("myfile.txt"));

しかし、コンパイラによってパスが変数として認識されないため、これを機能させることはできません。おそらく、インポートステートメントがありません。

0
Kimberly W

これはあなたを助けるはずです。

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!");
    }
}

}
0
Hussein Okasha

ファイルをリソースとしてロードし、入力ストリームを文字列に変換することをお勧めします。これにより、クラスパスに関連する任意の場所にファイルをロードする柔軟性が得られます

0
kuriouscoder