java.io.FileNotFoundException: le système ne peut pas trouver le fichier spécifié


Donc je suis coincé là-dessus depuis un moment. Fondamentalement, j'ai un fichier créé appelé " word.txt " et chaque fois que j'exécute le programme, il me donne cette erreur:

Exception in thread "main" java.io.FileNotFoundException: word.txt (The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at Hangman1.main(Hangman1.java:6)

Voici mon code:

import java.io.File;
import java.util.*;

public class Hangman1 {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(new File("word.txt"));          
        String in = "";         
        in = input.nextLine();          
    }
}

Ironiquement, j'ai créé le fichier "word.txt " dans le même répertoire que mon fichier java et pourtant, il me donne toujours cette erreur.

Author: Paul Samsotha, 2013-11-09

7 answers

Mettez le mot.txt directement en tant qu'enfant du dossier racine du projet et pair de src

Project_Root
    src
    word.txt

Avertissement: Je voudrais expliquer pourquoi cela fonctionne pour ce cas particulier et pourquoi cela peut ne pas fonctionner pour les autres.

Pourquoi ça marche:

Lorsque vous utilisez File ou l'une des autres variantes FileXxx, vous recherchez un fichier sur le système de fichiers par rapport au "répertoire de travail". Le répertoire de travail, peut être décrit comme ceci:

Quand vous exécutez à partir de la ligne de commande

C:\EclipseWorkspace\ProjectRoot\bin > java com.mypackage.Hangman1

Le répertoire de travail est C:\EclipseWorkspace\ProjectRoot\bin. Avec votreE (au moins tous ceux avec lesquels j'ai travaillé), le répertoire de travail est le ProjectRoot. Donc, lorsque le fichier est dans le ProjectRoot, alors utiliser uniquement le nom de fichier comme chemin relatif est valide, car il est à la racine du répertoire de travail.

De même, si c'était votre structure de projet ProjectRoot\src\word.txt, alors le chemin "src/word.txt" serait valide.

Pourquoi il ne Peut pas Travail

D'une part, le répertoire de travail pourrait toujours changer. Par exemple, en exécutant le code à partir de la ligne de commande comme dans l'exemple ci-dessus, le répertoire de travail est le bin. Donc, dans ce cas, il échouera, car il n'y a pas bin\word.txt

Deuxièmement, si vous deviez exporter ce projet dans un fichier jar et que le fichier était configuré pour être inclus dans le fichier jar, il échouerait également, car le chemin ne sera plus valide non plus.

Cela étant dit, vous devez déterminer si le fichier est d'être un embedded-resource (ou juste "resource" - termes que parfois j'utiliserai de manière interchangeable). Si c'est le cas, vous voudrez construire le fichier dans le chemin de classe et y accéder via une URL. La première chose que vous devez faire (dans ce cas particulier) est de vous assurer que le fichier obtient construit dans le chemin de classe. Avec le fichier à la racine du projet, vous devez configurer la génération pour inclure le fichier. , Mais si vous placez le fichier dans le src, ou dans un répertoire ci-dessous, puis la construction par défaut doit le mettre dans le chemin de classe.

Vous pouvez accéder à la ressource classpath de plusieurs façons. Vous pouvez utiliser le Class classe, qui a la méthode getResourceXxx, à partir de laquelle vous utilisez pour obtenir des ressources classpath.

Par exemple, si vous avez changé la structure de votre projet en ProjectRoot\src\resources\word.txt, vous pouvez utiliser ceci:

InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

getResourceAsStream retourne un InputStream, mais obtient une URL sous le capot. Alternativement, vous pouvez obtenir un URL si c'est ce dont vous avez besoin. getResource() renvoie une URL

Pour les utilisateurs Maven, où la structure de répertoire est comme src/main/resources, le contenu du dossier resources est placé à la racine du chemin de classe. Donc, si vous avez un fichier là-dedans, alors vous n'utiliseriez que getResourceAsStream("/thefile.txt")

 68
Author: Paul Samsotha, 2016-04-13 04:01:11

Les chemins relatifs peuvent être utilisés, mais ils peuvent être difficiles. La meilleure solution est de savoir où vos fichiers sont sauvés, qui est, imprimer le dossier:

import java.io.File;
import java.util.*;

public class Hangman1 {

    public static void main(String[] args) throws Exception {
        File myFile = new File("word.txt");
        System.out.println("Attempting to read from file in: "+myFile.getCanonicalPath());

        Scanner input = new Scanner(myFile);
        String in = "";
        in = input.nextLine();
    }

}

Ce code doit imprimer le dossier où il recherche. Placez le fichier là-bas et vous serez prêt à partir.

 12
Author: acdcjunior, 2013-11-09 03:22:30

Votre fichier doit être directement dans le dossier du projet, et non dans un autre sous-dossier.

Si le dossier de votre projet est nommé par exemple AProject, il doit être dans le même endroit que votre src dossier.

Aproject
        src
        word.txt
 2
Author: LotusUNSW, 2013-11-09 03:32:01

Je pense que cela se résume toujours au classpath. cela dit, si vous exécutez à partir du même dossier où votre .la classe est alors changée Scanner input = new Scanner(new File("word.txt")); en Scanner input = new Scanner(new File("./word.txt")); qui devrait fonctionner

 1
Author: Алексей, 2013-11-09 03:28:48

Assurez-vous que lorsque vous créez un fichier txt, vous ne tapez pas le nom "nom.txt", tapez simplement "nom". Si vous tapez "nom.txt "Eclipse le verra comme" nom.txt.txt". Cela a résolu pour moi. Enregistrez également le fichier dans le dossier src, pas le dossier était le .java réside, un dossier vers le haut.

 1
Author: Victor, 2016-04-12 19:22:55

Je lisais path à partir d'un fichier de propriétés et je n'ai pas mentionné qu'il y avait un espace à la fin. Assurez-vous que vous n'en avez pas.

 0
Author: Neftanic, 2017-02-15 11:36:33

J'ai le même problème, mais vous savez pourquoi? parce que je n'ai pas mis .txt à la fin de mon fichier et donc ce n'était pas un fichier texte, vous ne devez faire que deux choses:

  1. Placez votre fichier Texte dans le répertoire Racine (par exemple, si vous avez un projet appelé HelloWorld, faites un clic droit sur le fichier HelloWorld dans le répertoire du package et créez un fichier
  2. Enregistrez ce fichier avec n'importe quel nom que vous voulez mais avec un .txt à la fin de cela Je suppose que votre problème est résolu, mais je l'écris à d'autres les peuples savent que. Grâce.
 0
Author: Miner Dev, 2018-06-16 15:30:33