如何从与项目不同的文件夹中读取文件

时间:2017-02-20 22:24:40

标签: java

我正在尝试读取名为“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
       (...)

3 个答案:

答案 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