web-dev-qa-db-fra.com

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

J'ai un fichier nommé "Word.txt".

Il se trouve dans le même répertoire que mon fichier Java.

Mais lorsque j'essaie d'y accéder dans le code suivant, l'erreur fichier non trouvé se produit:

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();          
    }
}
48
name123

Placez le fichier Word.txt directement en tant qu'enfant du dossier racine du projet et en tant qu'homologue 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 variantes FileXxx, vous recherchez un fichier dans le système de fichiers relatif au "répertoire de travail" . Le répertoire de travail peut être décrit ainsi:

Lorsque vous exécutez depuis 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 (du moins tous ceux avec lesquels j'ai travaillé), le répertoire de travail est le ProjectRoot. Ainsi, lorsque le fichier se trouve dans ProjectRoot, le fait d'utiliser uniquement le nom du fichier comme chemin relatif est valide, car il se trouve à la racine du répertoire de travail.

De même, s'il s'agissait de la structure de votre projet _ProjectRoot\src\Word.txt_, le chemin _"src/Word.txt"_ serait valide.

Pourquoi cela ne fonctionne-t-il pas

D'une part, le répertoire de travail peut toujours changer. Par exemple, si vous exécutez le code à partir de la ligne de commande, comme dans l'exemple ci-dessus, le répertoire de travail est bin. Donc, dans ce cas, cela échouera, car il n'y a pas _bin\Word.txt_

Deuxièmement, si vous exportiez 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 serait plus valide non plus.

Cela étant dit, vous devez déterminer si le fichier doit être un embedded-resource (ou simplement "ressource" - termes que j'utiliserai parfois de manière interchangeable). Si tel est le cas, vous souhaiterez créer le fichier dans le chemin de classe et y accéder via une URL. La première chose à faire (dans ce cas particulier) est de s’assurer que le fichier est construit dans le chemin de classe . Avec le fichier à la racine du projet, vous devez configurer la construction pour inclure le fichier. Mais si vous placez le fichier dans le répertoire src ou dans l'un des répertoires ci-dessous, la construction par défaut doit le placer dans le chemin d'accès aux classes.

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

Par exemple, si vous avez modifié 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 InputStream, mais obtient une URL sous le capot. Sinon, vous pouvez obtenir un URL si c'est ce dont vous avez besoin. getResource() renverra une URL

Pour les utilisateurs Maven, où la structure de répertoires est semblable à _src/main/resources_, le contenu du dossier resources est placé à la racine du chemin de classe. Donc, si vous avez un fichier dedans, vous utiliseriez seulement getResourceAsStream("/thefile.txt")

84
Paul Samsotha

Les chemins relatifs peuvent être utilisés, mais ils peuvent être difficiles. La meilleure solution consiste à savoir où vos fichiers sont sauvegardés, c’est-à-dire à 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 fichier là-bas et vous serez prêt à partir.

14
acdcjunior

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

Aproject
        src
        Word.txt
2
LotusUNSW

Je lisais le chemin d'un fichier de propriétés et je n'ai pas mentionné qu'il y avait un espace à la fin. Assurez-vous de ne pas en avoir un.

2
Neftanic

J'ai le même problème, mais vous savez pourquoi? parce que je n'ai pas mis le fichier .txt à la fin de mon fichier et qu'il s'agissait donc d'un fichier et non d'un fichier texte, vous devez simplement faire deux choses:

  1. Placez 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 du package et créez le fichier.
  2. Enregistrez sous ce fichier avec le nom de votre choix mais avec un fichier .txt à la fin. Je suppose que votre problème est résolu, mais je l'écris à d'autres personnes qui le savent. Merci.
1
Miner Dev

Assurez-vous que lorsque vous créez un fichier txt vous ne tapez pas le nom "name.txt", il vous suffit de taper "name". Si vous tapez "name.txt", Eclipse le verra comme "name.txt.txt". Cela a résolu le problème pour moi. Enregistrez également le fichier dans le dossier src, pas dans le dossier où réside le fichier .Java, un dossier vers le haut.

1
Victor