Java 访问包中的文件

Java 访问包中的文件,java,junit,Java,Junit,我正在使用JUnit对我的应用程序进行一些自动化测试,这些测试位于JUnit类包中名为tests的文件夹中。 到目前为止,我通过以下方式访问文件: File file = new File(MyClass.class.getResource("../path/to/tests/" + name).toURI()); 有没有更干净(更好)的方法 谢谢我确保它们在类路径中,然后使用 MyClass.class.getResourceAsStream("../path/to/tests/" + na

我正在使用JUnit对我的应用程序进行一些自动化测试,这些测试位于JUnit类包中名为tests的文件夹中。 到目前为止,我通过以下方式访问文件:

File file = new File(MyClass.class.getResource("../path/to/tests/" + name).toURI());
有没有更干净(更好)的方法


谢谢

我确保它们在类路径中,然后使用

MyClass.class.getResourceAsStream("../path/to/tests/" + name);
不过,我不确定这会好多少。你不喜欢你现在使用的东西有什么


这是因为/当资源文件位于类路径中时。当它位于Eclipse或Intellij的源路径中时,这是免费的。如果您正在使用Hudson或类似的工具进行自动测试,则需要确保您的构建过程(Ant、Maven、shell脚本等)也将它们放在类路径中。

更好的方法是使用来自URL的方法getFile(),如下所示:

File file = new File(MyClass.class.getResource("../path/to/tests/" + name).getFile());

您的数据将更适合您的/tests/文件夹。这样可以避免使用从MyClass开始的相对路径,并且更符合逻辑。另外,您可以给我的类一个文件参数来加载数据文件。然后使用生产数据和测试数据调用它

问候,,
Stéphane

如果要使用类加载器加载测试数据,则不能使用
文件
文件
实例表示文件系统中的路径。该类从文件系统、jar文件、zip文件或其他地方加载文件。因此,类加载器不允许您访问文件,而是允许您访问资源

使用
MyClass.class.getResourceAsStream(“/the/absolute/path.txt”)
将path.txt文件的内容作为输入流加载。这个文件必须在类路径中的任何位置:path.txt是在文件系统中还是在jar中,只要能在类路径、包
中的.absolute
中找到它就无关紧要了。因此,如果您的数据文件位于tests文件夹中,该文件夹就在测试的sources目录下,那么要使用的路径应该是
/tests/data.txt
。请注意,这是因为Eclipse通过将非Java文件复制到输出目录(传统上是bin或classes)来自动“编译”这些文件,并且在运行测试时,该目录位于类路径中


如果您想以文本而不是字节的形式加载此数据,只需使用
InputStreamReader

InputStream
包装起来,eclipse包/文件夹视图中的文件和测试类在哪里?类I实例化在一个包中,文件在同一层次结构的另一个包中(即测试用例所在的位置). 然后在一个子文件夹中,我有用于每个测试用例的测试文件。我有/data/MyClass.java和/junitests/tests/我需要从MyClass.java访问tests/文件夹
不起作用,请参阅javadoc:。但正如您所说,使用完全限定的路径,测试仍然比引用文件系统中的某个文件更加独立和可预测。我不是一个真正有经验的Java程序员,但我认为访问包中文件的方法是。。“肮脏”。@Dilum-我不知道你读到了什么,或者你认为我的意思是什么,但它对我有效,我也不知道你在文档中指的是什么。澄清一下:我给出的示例将找到当前类所在包的父包的subpackage path.To.tests。因此,例如,如果MyClass在包com.foo.bar中,那么它将在com.foo.path.to.tests中找到“name”。当然,由于这是一个类路径,它可能位于与测试类完全不同的文件系统层次结构中,也可能不是,这取决于您的需要。@Luke,为了获取测试输入的资源,通常使用类系统而不是文件系统来引用它们更容易、更灵活。当然,您可能需要测试文件系统的行为,所以如果是这样的话,请忽略这一点。对于测试资源以外的资源,如配置文件等,您需要确保为自己提供足够的灵活性以适应这种情况。例如,如果您正在进行集成测试,需要通过配置文件引用外部资源,则可能需要添加一个间接级别。