2017-02-20 69 views
0

我試圖讀取名爲「級別」的文件夾中的txt文件。我使用掃描儀的課程在src/anotherPackageName,如果這是相關的。當我執行時:如何從項目以外的其他文件夾讀取文件

Scanner s = new Scanner(new File("levels/level0")); //adding .txt doesn't fix 

它引發異常。我不想使用絕對路徑,而是使用相對於該項目的可能。這是我的文件夾結構:

D:\OneDrive\Folder\AnotherFolder\ProjectName 

ProjectName 
    src 
     packageOne 
      ClassWhereImUsingScanner 
      OtherClasses 
     (...) 
    levels 
     level0 
     level1 
     (...) 

回答

2

因此,爲了訪問一個文件,你可以做這樣的事情:

FileReader sourceFile = new FileReader("levels/level0.txt"); 
BufferedReader inStream = new BufferedReader(sourceFile); 
String Line = inStream.readLine(); 

然後,你可以使用一個標記取決於您的數據,以及如何你想儲存。你可以看到這個例子:

1

通常的路徑是相對於你的執行,但它也取決於在Eclipse中的項目設置,你能不能把你的目錄結構的更多信息?

根據您的結構嘗試這樣的事:

Scanner s = new Scanner(new File("../levels/level0")); 
1

記住,在大多數Java代碼,該項目的最終狀態不是從IDE中運行,而是從一些生產系統(例如應用程序或服務器)。在這種情況下,您的開發源代碼結構將不可用。

在Java中有兩種主要的方式來讀取文本文件或其他資源:或者你可以找到實際文件的路徑,在這種情況下你需要處理可能沒有用完你的開發源代碼樹,否則你需要找到一種將文本文件捆綁到你的項目中的方法。

大多數Java項目最終都會被編譯成某種類型的歸檔文件,包括JAR文件或WAR文件(用於Web應用程序)或諸如Android APK之類的東西。在大多數情況下,您可以將自己的文本文件添加到項目歸檔中。 (例如,在Maven項目中,如果您只是將文本文件放在src/main/resources文件夾中,它應該包含在已編譯的JAR中。)

但是,在這種情況下,文本文件不再是單獨的文件磁盤,而是存檔中的一塊數據。你可以解壓檔案來得到一個實際的File對象,但如果你實際需要的只是讀取字節,這是浪費的。

因此,讀取這種文本文件最常見的方式是使用現有的ClassLoader機制,即從磁盤(或從存檔,或通過網絡或其他)讀取.class文件。 ClassLoader已經知道如何加載與編譯代碼「並排」的字節,因此您可以使用它。

在你的情況,你應該能夠做這樣的事情:

Scanner scanner = new Scanner(
    getClass().getResourceAsStream("/path/to/file.txt")); 

在這種情況下,/path/to/file.txt路徑是相對於你的類是從加載的路徑。例如。如果您的類名爲my.package.Foo,那麼實際的類字節將位於名爲my/package/Foo.class的文件夾(文件系統文件夾或JAR文件或其他)中 - 在這種情況下,path/to/file.txtmy/package/Foo.class將與相同的根相關。

查看the documentation on resources瞭解更多信息。

相關問題