2017-07-15 82 views
0

我目前正在嘗試編寫一個程序,它將逐行讀入文件並將每行添加到arrayList中。我的其他函數應該對來自該緩衝區的項目進行排序,然後將它們寫入文本文件。但是,即使我的文件位於src目錄中,以及具有我的.class文件的目錄中,我仍然不斷收到FileNotFoundException。我的代碼如下總是收到FileNotFoundException,即使使用SRC文件夾中的文件

public static ArrayList<String> readDictionary(String filename, 
ArrayList<String> buffer) throws IOException, FileNotFoundException { 
    File f = new File(filename); 
    Scanner fileIn = new Scanner(f); 
    //Scanner fileIn = new Scanner(new File(filename)); 
    boolean add = true; 

    while (fileIn.hasNextLine() == true) { 
     for (String s : buffer) { 
      if (fileIn.nextLine().equals(s)) { 
       add = false; 
      } 
     } 
     if (add == true) { 
      buffer.add(fileIn.nextLine()); 
     } 
     add = true; 
    } 
    fileIn.close(); 
    return buffer; 
} 

public static void writeDictionary(String filename, ArrayList<String> buffer) throws IOException, FileNotFoundException { 
    File f = new File(filename); 
    Collections.sort(buffer, String.CASE_INSENSITIVE_ORDER); 
    Path file = Paths.get(filename); 
    Files.write(file, buffer); 
} 

public static void main(String[] args) throws IOException, FileNotFoundException{ 
    ArrayList<String> buffer = new ArrayList<>(); 
    readDictionary("inputtest.txt", buffer); 
} 

Exception in thread "main" java.io.FileNotFoundException: inputtest.txt (The system cannot find the file specified) 
at java.io.FileInputStream.open0(Native Method) 
at java.io.FileInputStream.open(FileInputStream.java:195) 
at java.io.FileInputStream.<init>(FileInputStream.java:138) 
at java.util.Scanner.<init>(Scanner.java:611) 
at UltimateDictionary.readDictionary(UltimateDictionary.java:18) 
at UltimateDictionary.main(UltimateDictionary.java:46) 

我通過設置文件名等於「inputtest.txt」測試這個程序,而該文件正坐在與java文件我的src目錄,但它仍然拋出的錯誤。另外,我怎樣才能關閉這些文件? f.close()給我一個錯誤。

+0

你能否提供詳細的錯誤信息? – Fabien

+0

我在錯誤消息中編輯了以及用於測試它的主要方法。當文本文件位於目錄中時,我看不到如何得到此錯誤。 –

+1

提供絕對路徑怎麼樣?它可能來自應用程序從另一個工作目錄啓動的事實。 – Fabien

回答

-1

您的src或.class目錄中的文件只能表示文件在classpath中,而新文件(filename);搜索當前的工作目錄。要搜索classpath,請在File f = new File(filename)後更改readDictionary方法;加:

if (!f.exists()) { 
     URL url = <yourclassname>.class.getResource(filename); 
     if (url != null) 
      f = new File(url.getPath()); 
    } 

你必須使用yourclassname.class,因爲該方法是靜態的。還應該工作:

if (url == null) 
    url = ClassLoader.getSystemResource(filename); 
+0

如果應用程序打包在JAR中,那麼該URL甚至不會是*文件URL,這是正常的。 – EJP

+0

@EJP問題是關於目錄,而不是jar文件。 *你的語句完全是誤導,不會增加任何知識。*如果他想從jar中讀取文件,他應該使用getResourceAsStream,獲取inputStream,但不是想要的,因爲需要一個常規文件。 – ugo

+0

@EJP應用程序可以打包成一個jar包,但這並不意味着構建過程包含任何應用程序,那麼應用程序可能是e web應用程序,所以src裏面的內容通常會*包裝在WEB_INF/classes中,誰可以告訴? – ugo

相關問題