web-dev-qa-db-fra.com

comment lire un fichier texte en utilisant scanner en Java?

Ceci est mon code pour lire un fichier texte. Lorsque j'exécute ce code, le résultat dit "Fichier non trouvé.", Qui correspond au message FileNotFoundException. Je ne sais pas quel est le problème dans ce code.

Apparemment, cela fait partie de Java. Pour tout le fichier Java, l'utilisateur doit saisir quelque chose et créera un fichier texte en utilisant l'entrée comme nom . Après cela, l'utilisateur devra saisir le nom du fichier texte créé auparavant (supposons que l'utilisateur l'utilise correctement). ) et ensuite le programme devrait lire le fichier texte . J'ai correctement réalisé les autres parties de mon programme, mais le problème est que, lorsque je saisis le nom à nouveau, il ne trouve tout simplement pas le fichier texte, même si elles sont dans le même dossier.

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

Bien .. Apparemment, le fichier n'existe pas ou est introuvable. Essayez d'utiliser un chemin complet. Vous lisez probablement du mauvais répertoire quand vous ne spécifiez pas le chemin, sauf si a.txt se trouve dans votre répertoire de travail actuel.

4
GolezTrol

Si vous travaillez dans un IDE comme Eclipse ou NetBeans, vous devriez avoir ce fichier a.txt dans le répertoire racine de votre projet. (et non dans le dossier où vos fichiers .class sont construits ou ailleurs)

Sinon, vous devez spécifier le chemin absolu de ce fichier.


Modifier:
Vous pouvez placer le fichier .txt au même endroit avec le .class (généralement aussi le fichier .Java car vous compilez dans le même dossier) les fichiers compilés si vous le compilez à la main avec javac. En effet, il utilise le chemin relatif et le chemin indique à la machine virtuelle Java le chemin où se trouve le fichier exécutable.

Si vous utilisez un IDE, il générera les fichiers compilés pour vous en utilisant un Makefile ou quelque chose de similaire pour Windows et considérera sa structure de fichier par défaut, afin qu'il sache que le chemin relatif commence au dossier racine du projet.

4
Iulius Curt

Juste une autre chose ... Au lieu de System.out.println("Error Message Here"), utilisez System.err.println("Error Message Here"). Cela vous permettra de distinguer les différences entre les erreurs et le fonctionnement normal du code en affichant les erreurs (c'est-à-dire tout ce qui se trouve dans System.err.println()) en rouge.

NOTE: Cela fonctionne aussi avec System.err.print("Error Message Here")

0
JavaBoss

Si vous attribuez une chaîne à un objet Scanner, il le lira sous forme de données. C'est-à-dire que "a.txt" n'ouvre pas un fichier appelé "a.txt". Il lit littéralement dans les caractères "a", ".", "T" et ainsi de suite.

Ceci est conforme à Core Java Volume I, section 3.7.3.

Si je trouve une solution pour lire les chemins réels, je reviendrai et mettrai à jour cette réponse. La solution proposée par ce texte est d'utiliser

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

Mais je ne peux pas obtenir que cela fonctionne car Path n'est pas reconnu comme une variable par le compilateur. Peut-être me manque une déclaration d'importation.

0
Kimberly W

Cela devrait vous aider ..:

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

Je recommanderais de charger le fichier en tant que ressource et de convertir le flux d'entrée en chaîne. Cela vous donnerait la possibilité de charger le fichier n'importe où par rapport au classpath

0
kuriouscoder