2013-10-10 3 views
18

J'ai une affectation pour ma classe CS où il est dit de lire un fichier avec plusieurs résultats de test et me demande de les additionner et de les faire la moyenne. Alors que la somme et la moyenne sont faciles, j'ai des problèmes avec la lecture du fichier. L'instructeur a dit d'utiliser cette syntaxeJava nouveau File() dit FileNotFoundException mais le fichier existe

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

Cependant, cela jette un FileNotFoundException, mais je l'ai vérifié encore et encore pour voir si le fichier existe dans le dossier en cours, et après cela, je me suis dit qu'il fallait faire quelque chose avec les autorisations. J'ai changé les permissions de lecture et d'écriture pour tout le monde, mais ça ne fonctionnait toujours pas et ça continue de jeter l'erreur. Est-ce que quelqu'un a une idée de pourquoi cela peut se produire?

EDIT: Il était en fait pointant vers un répertoire, cependant, j'ai résolu ce problème. File.Exists() retourne vrai, cependant, lorsque je tente de le mettre dans le scanner, il lance le 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); 
     } 
} 
+4

Qu'est-ce que le répertoire courant? Essayez d'imprimer 'new File (". ")' – Steinar

+4

Imprimez le chemin de 'new File (" scores.dat ")' et vérifiez si elle existe dans le répertoire attendu. –

+0

@Steinar il recherche dans le bon répertoire, et il donne le chemin absolu correct, cependant, le fichier n'est toujours pas trouvé – scrblnrd3

Répondre

26

Il y a trois cas où un FileNotFoundException peut être levée.

  1. Le fichier nommé n'existe pas.
  2. Le fichier nommé est en fait 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 voudrais tester contre le troisième cas en utilisant file.canRead().

Si le test ci-dessus renvoie vrai, je soupçonne les suivantes:

Vous pourriez avoir oublié de jeter explicitement ou intercepter l'exception potentielle (à savoir, FileNotFoundExcetion). Si vous travaillez dans un IDE, vous devriez avoir une plainte du compilateur. Mais je soupçonne que vous n'avez pas exécuté votre code dans un tel IDE.

J'ai couru juste votre code sans prendre soin de la plainte de Netbeans, pour faire passer le message d'exception suivant:

Exception dans le thread "principal" java.lang.RuntimeException: Uncompilable Code source - exception non signalée java.io.FileNotFoundException; doit être pris ou déclaré être jeté

Essayez le code suivant et voir si l'exception disparaîtrait:

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

Oui. merci beaucoup – scrblnrd3

+0

Votre troisième cas comprend les deux autres, et comprend également un certain nombre d'autres cas facilement séparables tels que les problèmes d'autorisation, les pannes de réseau, etc., ce qui n'est pas très éclairant, et ne fait aucune sorte de cas pour "trois cas". Tester 'File.canRead()' est inutile quand vous devez déjà attraper une exception, et gaspillage lorsque le système doit le tester de toute façon pendant l'ouverture. – EJP

+0

"Si le test ci-dessus renvoie vrai" - et si cela renvoie false? :) – Line

26

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 voir où le chemin est:

System.out.println(new File(".").getAbsoluteFile()); 
+1

Il ne devrait pas être, c'est la réponse à toute la solution qui est nécessaire pour résoudre le problème des auteurs. – libik

+1

+1 Je ne suis pas d'accord @josh, je pense que c'est une bonne réponse. C'est ce que j'aurais posté – Bohemian

+0

C'est simplement une suggestion; nous ne recevons aucune information supplémentaire autre que celle qui est affichée dans la question. C'est simplement une tactique de débogage; il * pourrait * aider l'opérateur à résoudre son problème, mais que faire si le fichier existe réellement? –

7

Évidemment, il y a un certain nombre de causes possibles et les réponses précédentes documentez bien , mais voici comment j'ai résolu cela dans un cas particulier:

Un de mes étudiants avait ce problème et j'ai failli m'arracher les cheveux en essayant de comprendre. Il s'est avéré que le fichier n'existait pas, même s'il semblait que c'était le cas. 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 avoir le nom "data.txt", son nom de fichier est "data.txt.txt".

Espérons que cela aide les autres à se sauver les cheveux.

+0

Merci pour l'information. J'ai eu le même problème. – sriram

+0

Même problème. Quand rien n'a de sens, les gens devraient vérifier cette solution. –

2

J'ai récemment trouvé un cas intéressant qui produit FileNotFoundExeption lorsque le fichier existe évidemment sur le disque. Dans mon programme, je lis le chemin du fichier à partir d'un autre fichier texte et créer un objet fichier:

//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 ce chemin contient des symboles invisibles \ r \ n à la fin. Fix:

File file = new File(path.trim()); 
0

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 à travers Scanner ou via des arguments de ligne de commande, au lieu de copier coller le chemin directement à partir de l'Explorateur Windows, tapez manuellement dans le chemin.

Il a travaillé pour moi, il aide quelqu'un espère :)

1

Lecture et écriture depuis et vers un fichier peuvent être bloqués par votre système d'exploitation en fonction de l'autorisation du fichier des attributs.

Si vous essayez de lire à partir du fichier, je recommande d'utiliser la méthode setReadable pour le régler vrai, ou, ce code par exemple du fichier:

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 , alors je recommande d'utiliser la méthode setWritable de File pour le mettre à vrai, 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.) 
Questions connexes