我正在尝试读取名为“levels”的文件夹中的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
(...)
答案 0 :(得分:2)
因此,为了访问文件,您可以执行以下操作:
FileReader sourceFile = new FileReader("levels/level0.txt");
BufferedReader inStream = new BufferedReader(sourceFile);
String Line = inStream.readLine();
然后,您可以根据数据以及存储方式使用标记器。
您可以看到此示例:http://www.mkyong.com/java/how-to-read-file-from-java-bufferedreader-example/
答案 1 :(得分:1)
通常路径与您的执行相关,但它还取决于您在eclipse上的项目设置,您是否可以发送有关您的目录结构的更多信息?
根据你的结构尝试这样的事情:
Scanner s = new Scanner(new File("../levels/level0"));
答案 2 :(得分: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文件或其他内容)中 - 在本例中为{{1} }和path/to/file.txt
将相对于同一个根。
有关详细信息,请参阅the documentation on resources。