2017-02-20 44 views
0

我试图读取名为“级别”的文件夹中的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 
     (...) 

回答

2

因此,为了访问一个文件,你可以做这样的事情:

FileReader sourceFile = new FileReader("levels/level0.txt"); 
BufferedReader inStream = new BufferedReader(sourceFile); 
String Line = inStream.readLine(); 

然后,你可以使用一个标记取决于您的数据,以及如何你想储存。你可以看到这个例子:

1

通常的路径是相对于你的执行,但它也取决于在Eclipse中的项目设置,你能不能把你的目录结构的更多信息?

根据您的结构尝试这样的事:

Scanner s = new Scanner(new File("../levels/level0")); 
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文件或其他)中 - 在这种情况下,path/to/file.txtmy/package/Foo.class将与相同的根相关。

查看the documentation on resources了解更多信息。

相关问题