我有一个名为“ word.txt” 的文件。
“ word.txt”
它与我的java文件位于同一目录中。
java
但是,当我尝试通过以下代码访问它时,找不到此文件,发生错误:
Exception in thread "main" java.io.FileNotFoundException: word.txt (The system cannot find the file specified) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(Unknown Source) at java.util.Scanner.<init>(Unknown Source) at Hangman1.main(Hangman1.java:6)
这是我的代码:
import java.io.File; import java.util.*; public class Hangman1 { public static void main(String[] args) throws Exception { Scanner input = new Scanner(new File("word.txt")); String in = ""; in = input.nextLine(); } }
直接将word.txt作为项目根文件夹的子级和src的对等方放置
Project_Root src word.txt
免责声明:我想解释一下为什么这种方法适用于这种特殊情况,以及为什么它可能不适用于其他情况。
工作原理:
使用File或任何其他FileXxx变体时,你正在文件系统上相对于“工作目录”查找文件。工作目录,可以这样描述:
File
FileXxx
当你从命令行运行时
C:\EclipseWorkspace\ProjectRoot\bin > java com.mypackage.Hangman1
工作目录为C:\EclipseWorkspace\ProjectRoot\bin。使用你的IDE(至少是我使用过的所有IDE),工作目录为ProjectRoot。因此,当文件位于中时ProjectRoot,仅使用文件名作为相对路径是有效的,因为它位于工作目录的根目录中。
C:\EclipseWorkspace\ProjectRoot\bin
ProjectRoot
同样,如果这是你的项目结构ProjectRoot\src\word.txt,则该路径"src/word.txt"将有效。
ProjectRoot\src\word.txt
"src/word.txt"
为什么它可能行不通
首先,工作目录可以随时更改。例如,像上面的示例一样从命令行运行代码,工作目录为bin。所以在这种情况下它将失败,因为没有bin\word.txt
bin\word.txt
其次,如果要将项目导出到jar中,并且文件被配置为包含在jar中,则该文件也将失败,因为该路径也将不再有效。
话虽如此,你需要确定文件是否是嵌入式资源(或仅仅是“资源”-有时我会互换使用的术语)。如果是这样,那么你将需要将文件构建到类路径中,并通过URL访问它。在这种情况下,你需要做的第一件事是确保将文件构建到类路径中。将文件放在项目根目录中,你必须配置构建以包括该文件。但是,如果将文件放在下面的src或目录中,则默认构建应将其放在类路径中。
你可以通过多种方式访问类路径资源。你可以利用Class具有getResourceXxx方法的类,从中获取类路径资源。
Class
getResourceXxx
例如,如果将项目结构更改为ProjectRoot\src\resources\word.txt,则可以使用以下命令:
ProjectRoot\src\resources\word.txt
InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); getResourceAsStream返回一个InputStream,但在后台获取一个URL。或者,URL如果需要的话,你可以得到一个。getResource()将返回一个URL
InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); getResourceAsStream
InputStream
getResource()
对于Maven用户,目录结构类似于src/main/resources,resources文件夹的内容放在类路径的根目录下。因此,如果其中有文件,则只能使用getResourceAsStream("/thefile.txt")
src/main/resources,resources
getResourceAsStream("/thefile.txt")