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

donc je suis coincé là-dessus depuis un moment. En gros, j'ai créé un fichier appelé "word.txt" et à chaque fois que je lance 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 mot "Fichier".txt" dans le même répertoire que mon fichier java et pourtant, il me donne toujours cette erreur.

35
demandé sur Paul Samsotha 2013-11-09 07:13:55

7 réponses

mettez le mot.txt directement comme un enfant du dossier racine du projet et un Pair de src

Project_Root
    src
    word.txt

clause de non-responsabilité: j'aimerais expliquer pourquoi cela fonctionne pour ce cas particulier et pourquoi il peut ne pas fonctionner pour d'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 relatif au " répertoire de travail " . Le répertoire de travail, peut être décrit comme ceci:

quand vous utilisez la ligne de commande

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

le répertoire de travail est C:\EclipseWorkspace\ProjectRoot\bin . Avec votre IDE (au moins tous ceux avec lesquels j'ai travaillé), le répertoire de travail est le ProjectRoot . Ainsi, lorsque le fichier est dans le ProjectRoot , alors en utilisant juste le nom du fichier comme le 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 , le chemin "src/word.txt" serait valide.

pourquoi cela ne fonctionne pas

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

deuxièmement, si vous exportez ce projet dans un jar, et que le fichier a été configuré pour être inclus dans le jar, il échouera aussi, car le chemin ne sera plus valide non plus.

cela étant dit, vous devez déterminer si le fichier doit être un (ou tout simplement" ressource " - termes que parfois je vais utiliser de façon interchangeable). Si oui, alors vous voudrez construisez le fichier dans classpath, et accédez-le via une URL. La première chose que vous devez faire (dans ce cas, est de vous assurer que le fichier construit dans le classpath. Avec le fichier dans la racine du projet, vous devez configurer la compilation d'inclure le fichier. mais si vous mettez le fichier dans le src ou dans un répertoire ci-dessous, alors la construction par défaut devrait le mettre dans le chemin de classe.

vous pouvez accéder ressources classpath dans un certain nombre de façons. Vous pouvez utiliser la classe Class , qui a la méthode getResourceXxx , à partir de laquelle vous utilisez pour obtenir les 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 renvoie une InputStream , mais obtient une URL sous le capot. Alternativement, vous pourriez obtenir un URL si c'est ce dont vous avez besoin. getResource() retournera une URL

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

68
répondu Paul Samsotha 2016-04-13 04:01:11
Les chemins relatifs

peuvent être utilisés, mais ils peuvent être délicats. 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 devrait imprimer le dossier où il cherche. Placez le dossier là-bas et vous serez prêt à partir.

12
répondu acdcjunior 2013-11-09 03:22:30

votre fichier doit se trouver 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 au même endroit que votre dossier src .

Aproject
        src
        word.txt
2
répondu LotusUNSW 2013-11-09 03:32:01

je pense que ça revient toujours au classpath . cela dit, si vous exécutez à partir du même dossier où votre .la classe est alors de changer Scanner input = new Scanner(new File("word.txt")); en Scanner input = new Scanner(new File("./word.txt")); qui devrait fonctionner

1
répondu Алексей 2013-11-09 03:28:48

assurez-vous que lorsque vous créez un fichier txt vous ne tapez pas le nom" name.txt", tapez juste "nom". Si vous tapez "nom.txt "Eclipse le verra comme" nom.txt.txt". Cela a résolu pour moi. Enregistrez aussi le fichier dans le dossier src, pas le dossier étaient les .java réside, un dossier vers le haut.

1
répondu 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
répondu Neftanic 2017-02-15 11:36:33

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

  1. mettez votre fichier texte dans le répertoire racine (E. x si vous avez un projet appelé HelloWorld, cliquez avec le bouton droit de la souris sur le fichier HelloWorld dans le répertoire des paquets et créez le fichier
  2. enregistrer comme ce fichier avec n'importe quel nom que vous voulez mais avec un .txt à la fin de l' Je suppose que votre problème résolu, mais je l'écris pour les autres peuples le savent. Grâce.
0
répondu Miner Dev 2018-06-16 15:30:33