2013-10-10 38 views
18

我有一個CS類的任務,它說要讀取具有多個測試分數的文件,並要求對它們進行求和和平均。雖然求和和平均很容易,但我在閱讀文件時遇到問題。指導員說,使用這種語法Java新文件()說FileNotFoundException但文件存在

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

但是,這將引發一個FileNotFoundException異常,但我檢查了一遍又一遍,看是否該文件在當前文件夾中存在,在那之後,我計算過,它必須用權限做些事情。我改變了讀寫權限,但仍然無法正常工作,並且仍然不斷拋出錯誤。有誰知道爲什麼會發生這種情況?

編輯:它實際上是指向一個目錄,但是,我已經解決了這個問題。 file.exists()返回true,但是,當我試圖把它的掃描儀,它拋出FileNotFoundException異常

這裏是我的代碼

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

什麼是當前目錄?嘗試打印新文件(「。」)' – Steinar

+4

打印'新文件(「scores.dat」)的路徑'並仔細檢查它是否存在於預期的目錄中。 –

+0

@Steinar它正在正確的目錄中搜索,它提供了正確的絕對路徑,但是,該文件仍然沒有找到 – scrblnrd3

回答

26

有三種情況,其中一個FileNotFoundException可能拋出。

  1. 指定的文件不存在。
  2. 指定的文件實際上是一個目錄。
  3. 指定的文件由於某種原因無法打開以供閱讀。

前兩種情況不太可能根據您的描述。我會使用file.canRead()對第三個案例進行測試。

如果上述測試返回true,我會懷疑如下:

您可能忘記顯式地拋出或捕捉潛在的異常(即FileNotFoundExcetion)。如果你在IDE中工作,你應該從編譯器中得到一些投訴。但是我懷疑你沒有在這樣的IDE中運行你的代碼。

我剛剛運行您的代碼而不採取從NetBeans中投訴的護理,只得到下面的異常消息:在線程

異常「主」了java.lang.RuntimeException:不可編譯的 源代碼 - 未報告的異常java.io.FileNotFoundException異常;必須 被捕獲或聲明拋出

嘗試下面的代碼,看看是否異常就會消失:

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

是的。非常感謝你 – scrblnrd3

+0

你的第三種情況包括其他兩種情況,並且還包括許多其他容易分離的情況,例如許可問題,網絡故障等,這些情況不是很有啓發性,也沒有任何形式的有'三案'的情況。測試'File.canRead()'當你必須捕獲一個異常時是無效的,而且當系統在打開的時候必須對它進行測試的時候是浪費的。 – EJP

+0

「如果上面的測試返回true」 - 以及如果這返回false? :) – Line

26

代碼本身工作正常。問題是,程序工作路徑指向的是其他地方,而不是您想象的。

使用此行,看看那裏的路徑是:

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

它應該不是,它是解決作者問題所需的所有解決方案的答案。 – libik

+1

+1我不同意@josh,我認爲這是一個很好的答案。這是我會發布的 – Bohemian

+0

這僅僅是一個建議;除問題中發佈的內容外,我們未提供任何其他信息。這只是一種調試策略;它可能會幫助解決他的問題,但如果文件真的存在呢? –

7

顯然,有一些可能的原因和以前的答案以及記錄他們,但這裏是我如何解決這個在一個特定的情況下:

我的一個學生有這個問題,我幾乎把我的頭髮試圖弄清楚。事實證明,該文件不存在,即使它看起來像它。問題在於Windows 7被配置爲「隱藏已知文件類型的文件擴展名」。這意味着如果文件名稱爲「data.txt」,則其實際的文件名爲「data.txt.txt」。

希望這可以幫助其他人省去一些頭髮。

+0

感謝您的信息。我遇到過同樣的問題。 – sriram

+0

同樣的問題。沒有任何意義時,人們應該檢查這個解決方案。 –

2

我最近發現有趣的案例,當磁盤上明顯存在文件時會產生FileNotFoundExeption。 在我的節目,我讀了另一個文本文件,文件的路徑和文件創建對象:

//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 

故事的原因是路徑在結尾處包含無形\ r \ n個符號。 修復:

File file = new File(path.trim()); 
0
從這裏提到的所有其他答案

除此之外,你可以做的一件事情是爲我工作。

如果您正在通過掃描程序或通過命令行參數讀取路徑,而不是直接從Windows資源管理器複製粘貼路徑,只需手動輸入路徑中的即可。

它爲我工作,希望它可以幫助別人:)

1

閱讀並從和向文件中寫入可以通過你的操作系統取決於文件的權限屬性被阻止。

如果你想從文件中讀取,那麼我建議使用文件的setReadable方法將其設置爲true,或者,如下面的代碼:

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. 

如果你試圖寫入文件,那麼我建議使用File的setWritable方法將其設置爲true,或者,例如此代碼:

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.) 
相關問題