Java 如何从与项目不同的文件夹中读取文件
我正在尝试读取一个名为“levels”的文件夹中的txt文件。如果相关的话,我使用扫描仪的类位于Java 如何从与项目不同的文件夹中读取文件,java,Java,我正在尝试读取一个名为“levels”的文件夹中的txt文件。如果相关的话,我使用扫描仪的类位于src/anotherPackageName中。当我执行: Scanner s = new Scanner(new File("levels/level0")); //adding .txt doesn't fix 它抛出一个异常。我不想使用绝对路径,而是尽可能使用相对于项目的路径。这是我的文件夹结构: D:\OneDrive\Folder\AnotherFolder\ProjectName Pr
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
(...)
通常路径是相对于您的执行的,但它也取决于您在eclipse上的项目设置,您能发送更多关于您的目录结构的信息吗 根据您的结构,尝试以下方法:
Scanner s = new Scanner(new File("../levels/level0"));
Scanner scanner = new Scanner(
getClass().getResourceAsStream("/path/to/file.txt"));
FileReader sourceFile = new FileReader("levels/level0.txt");
BufferedReader inStream = new BufferedReader(sourceFile);
String Line = inStream.readLine();
通常路径是相对于您的执行的,但它也取决于您在eclipse上的项目设置,您能发送更多关于您的目录结构的信息吗 根据您的结构,尝试以下方法:
Scanner s = new Scanner(new File("../levels/level0"));
Scanner scanner = new Scanner(
getClass().getResourceAsStream("/path/to/file.txt"));
FileReader sourceFile = new FileReader("levels/level0.txt");
BufferedReader inStream = new BufferedReader(sourceFile);
String Line = inStream.readLine();
请记住,在大多数Java代码中,项目的最终状态不是从IDE运行的,而是从某些生产系统(例如应用程序或服务器)运行的。在这种情况下,您的开发源代码结构将不可用 在Java中,有两种主要的读取文本文件或其他资源的方法:要么您可以找到实际文件的路径,在这种情况下,您需要处理可能没有耗尽开发源代码树的问题,要么您需要找到一种方法将文本文件捆绑到您的项目中 大多数Java项目最终都会被编译成某种存档,要么是JAR文件,要么是WAR文件(对于web应用程序),要么是Android APK之类的东西。在大多数情况下,您可以将自己的文本文件添加到项目存档中。(例如,在Maven项目中,如果您只是将文本文件放在
src/main/resources
文件夹中,那么它应该包含在已编译的JAR中。)
但是,在这种情况下,文本文件不再是磁盘上的单独文件,而是存档中的一个数据块。您可以解压归档文件以获得实际的文件
对象,但如果您实际上只需要读取字节,那么这是浪费
因此,读取此类文本文件的最常见方式是使用现有的类加载器
机制,即从磁盘(或从存档文件,或通过网络或其他方式)读取.class
文件。ClassLoader
已经知道如何加载编译代码旁边的字节,因此您可以利用这些字节
在您的情况下,您应该能够执行以下操作:
Scanner s = new Scanner(new File("../levels/level0"));
Scanner scanner = new Scanner(
getClass().getResourceAsStream("/path/to/file.txt"));
FileReader sourceFile = new FileReader("levels/level0.txt");
BufferedReader inStream = new BufferedReader(sourceFile);
String Line = inStream.readLine();
在本例中,/path/to/file.txt
路径是相对于类的加载路径。例如,如果您的类名为my.package.Foo
,那么实际的类字节将位于名为my/package/Foo.class
的文件夹(文件系统文件夹或JAR文件或其他文件)中——在这种情况下,路径/to/file.txt
和my/package/Foo.class
将相对于同一根
请参阅以获取更多信息。请记住,在大多数Java代码中,项目的最终状态不是从IDE运行的,而是从某些生产系统(例如应用程序或服务器)运行的。在这种情况下,您的开发源代码结构将不可用 在Java中,有两种主要的读取文本文件或其他资源的方法:要么您可以找到实际文件的路径,在这种情况下,您需要处理可能没有耗尽开发源代码树的问题,要么您需要找到一种方法将文本文件捆绑到您的项目中 大多数Java项目最终都会被编译成某种存档,要么是JAR文件,要么是WAR文件(对于web应用程序),要么是Android APK之类的东西。在大多数情况下,您可以将自己的文本文件添加到项目存档中。(例如,在Maven项目中,如果您只是将文本文件放在
src/main/resources
文件夹中,那么它应该包含在已编译的JAR中。)
但是,在这种情况下,文本文件不再是磁盘上的单独文件,而是存档中的一个数据块。您可以解压归档文件以获得实际的文件
对象,但如果您实际上只需要读取字节,那么这是浪费
因此,读取此类文本文件的最常见方式是使用现有的类加载器
机制,即从磁盘(或从存档文件,或通过网络或其他方式)读取.class
文件。ClassLoader
已经知道如何加载编译代码旁边的字节,因此您可以利用这些字节
在您的情况下,您应该能够执行以下操作:
Scanner s = new Scanner(new File("../levels/level0"));
Scanner scanner = new Scanner(
getClass().getResourceAsStream("/path/to/file.txt"));
FileReader sourceFile = new FileReader("levels/level0.txt");
BufferedReader inStream = new BufferedReader(sourceFile);
String Line = inStream.readLine();
在本例中,/path/to/file.txt
路径是相对于类的加载路径。例如,如果您的类名为my.package.Foo
,那么实际的类字节将位于名为my/package/Foo.class
的文件夹(文件系统文件夹或JAR文件或其他文件)中——在这种情况下,路径/to/file.txt
和my/package/Foo.class
将相对于同一根
有关更多信息,请参阅。因此,要访问文件,您可以执行以下操作:
Scanner s = new Scanner(new File("../levels/level0"));
Scanner scanner = new Scanner(
getClass().getResourceAsStream("/path/to/file.txt"));
FileReader sourceFile = new FileReader("levels/level0.txt");
BufferedReader inStream = new BufferedReader(sourceFile);
String Line = inStream.readLine();
然后,您可以根据数据和存储方式使用标记器
您可以看到以下示例:因此,为了访问文件,您可以执行以下操作:
Scanner s = new Scanner(new File("../levels/level0"));
Scanner scanner = new Scanner(
getClass().getResourceAsStream("/path/to/file.txt"));
FileReader sourceFile = new FileReader("levels/level0.txt");
BufferedReader inStream = new BufferedReader(sourceFile);
String Line = inStream.readLine();
然后,您可以根据数据和存储方式使用标记器
您可以看到以下示例: