記住,在大多數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.txt
和my/package/Foo.class
將與相同的根相關。
查看the documentation on resources瞭解更多信息。