记住,在大多数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了解更多信息。