web-dev-qa-db-fra.com

Java new File () dit FileNotFoundException mais le fichier existe

J'ai une tâche pour ma classe de CS où il est dit de lire un fichier avec plusieurs scores de test et me demande de les résumer et de les faire la moyenne. Bien que la somme et la moyenne soient faciles, j'ai des problèmes avec la lecture des fichiers. L'instructeur a dit d'utiliser cette syntaxe

Scanner scores=new Scanner(new File("scores.dat"));

Cependant, cela lève une exception FileNotFoundException, mais j'ai vérifié maintes et maintes fois pour voir si le fichier existe dans le dossier en cours, et après cela, j'ai pensé qu'il devait faire quelque chose avec les autorisations. J'ai changé les autorisations de lecture et d'écriture pour tout le monde, mais cela ne fonctionnait toujours pas et continuait à générer l'erreur. Quelqu'un at-il une idée de pourquoi cela peut se produire?

EDIT: Il était en fait pointant vers un répertoire en haut, cependant, j'ai résolu ce problème. file.exists () renvoie true, cependant, lorsque j'essaie de le mettre dans le scanner, il renvoie la filenotfoundexception

Voici tout mon code

import Java.util.Scanner;
import Java.io.*;
public class readInt{
        public static void main(String args[]){
                File file=new File("lines.txt");
                System.out.println(file.exists());
                Scanner scan=new Scanner(file);
        }
}
26
scrblnrd3

Il y a trois cas où une FileNotFoundException peut être lancée.

  1. Le fichier nommé n'existe pas.
  2. Le fichier nommé est en réalité un répertoire.
  3. Le fichier nommé ne peut pas être ouvert en lecture pour une raison quelconque.

Les deux premiers cas sont peu probables selon votre description. Je testerais contre le troisième cas en utilisant file.canRead().

Si le test ci-dessus se vérifie, je suspecterais ce qui suit:

Vous avez peut-être oublié de lancer ou d’attraper explicitement l’exception potentielle (c.-à-d. FileNotFoundExcetion). Si vous travaillez dans un environnement de développement intégré, vous devriez avoir une plainte du compilateur. Mais je suppose que vous n'avez pas exécuté votre code dans un tel environnement.

Je viens juste de lancer votre code sans prendre en charge la plainte de Netbeans, seulement pour recevoir le message d'exception suivant:

Exception dans le fil "principal" Java.lang.RuntimeException: Uncompilable code source - exception non signalée Java.io.FileNotFoundException; doit être attrapé ou déclaré être jeté

Essayez le code suivant et voyez si l’exception aurait disparu:

public static void main(String[] args) throws FileNotFoundException {    
    File file=new File("scores.dat");
    System.out.println(file.exists());
    Scanner scan=new Scanner(file);
}
36
Terry Li

Le code lui-même fonctionne correctement. Le problème est que le chemin de travail du programme pointe vers un autre endroit que vous ne le pensez.

Utilisez cette ligne et voyez où se trouve le chemin:

System.out.println(new File(".").getAbsoluteFile());
38
libik

Évidemment, il existe un certain nombre de causes possibles et les réponses précédentes les documentent bien, mais voici comment j'ai résolu ce problème dans un cas particulier:

Un de mes étudiants a eu ce problème et je me suis presque déchiré les cheveux en essayant de le résoudre. Il s’est avéré que le fichier n’existait pas, même s’il ressemblait à cela. Le problème était que Windows 7 était configuré pour "Masquer les extensions de fichiers pour les types de fichiers connus". Cela signifie que si le fichier semble porter le nom "data.txt", son nom de fichier actual est "data.txt.txt".

J'espère que cela aide les autres à se sauver des cheveux.

10
petehern

J'ai récemment trouvé un cas intéressant qui produit FileNotFoundExeption lorsque le fichier existe de toute évidence sur le disque. Dans mon programme, je lis le chemin du fichier depuis un autre fichier texte et crée un objet File: 

//String path was read from file
System.out.println(path); //file with exactly same visible path exists on disk
File file = new File(path); 
System.out.println(file.exists());  //false
System.out.println(file.canRead());  //false
FileInputStream fis = new FileInputStream(file);  // FileNotFoundExeption 

La cause de l'histoire est que ce chemin contient des symboles invisibles à la fin. Réparer: 

File file = new File(path.trim()); 
3
yurin

La lecture et l’écriture depuis et vers un fichier peuvent être bloquées par votre système d’exploitation en fonction des attributs d’autorisation du fichier.

Si vous essayez de lire à partir du fichier, je vous recommande alors d'utiliser la méthode setReadable de File pour le définir sur true ou ce code par exemple:

String arbitrary_path = "C:/Users/Username/Blah.txt";
byte[] data_of_file;
File f = new File(arbitrary_path);
f.setReadable(true);
data_of_file = Files.readAllBytes(f);
f.setReadable(false); // do this if you want to prevent un-knowledgeable 
                      //programmers from accessing your file.

Si vous essayez d'écrire dans le fichier, je vous recommande alors d'utiliser la méthode setWritable de File pour le définir sur true ou ce code par exemple:

String arbitrary_path = "C:/Users/Username/Blah.txt";
byte[] data_of_file = { (byte) 0x00, (byte) 0xFF, (byte) 0xEE };
File f = new File(arbitrary_path);
f.setWritable(true);
Files.write(f, byte_array);
f.setWritable(false); // do this if you want to prevent un-knowledgeable 
                      //programmers from changing your file (for security.)
2
Solumyr

En dehors de toutes les autres réponses mentionnées ici, vous pouvez faire une chose qui a fonctionné pour moi.

Si vous lisez le chemin via Scanner ou via des arguments de ligne de commande, au lieu de copier le chemin directement à partir de l'Explorateur Windows, saisissez manuellement.

Cela a fonctionné pour moi, j'espère que ça aidera quelqu'un :)

1
Alok

Une solution facile, qui a fonctionné pour moi, consiste à déplacer mes fichiers de src vers le dossier principal du projet. Ce n'est pas la meilleure solution, mais selon l'ampleur du projet et votre temps, elle pourrait être parfaite.

0
Irina Larisa