在java中从父目录创建文件的文件对象

在java中从父目录创建文件的文件对象,java,io,Java,Io,我遇到访问某个父目录中的文件的问题。 为了解释,考虑以下DIR结构:- C:/Workspace/Appl/src/org/abc/bm/TestFile.xml C:/Workspace/Appl/src/org/abc/bm/tests/CheckTest.java 在CheckTest.java中,我想为TestFile.xml创建一个文件实例 public class Check { public void checkMethod() { File f =


我遇到访问某个父目录中的文件的问题。
为了解释,考虑以下DIR结构:-

C:/Workspace/Appl/src/org/abc/bm/TestFile.xml  
C:/Workspace/Appl/src/org/abc/bm/tests/CheckTest.java
在CheckTest.java中,我想为TestFile.xml创建一个文件实例

public class Check {
    public void checkMethod() {
        File f = new File({filePath value I want to determine}, "TestFile.xml");
    }
}
我尝试了一些关于
getAbsolutePath()
getParent()
等的东西,但是变得有点复杂,坦白说,我想我把事情搞砸了。
我不想在创建
文件
实例时使用
“C:/Workspace/Appl/src/org/abc/bm”
的原因是
C:/Workspace/Appl
不是固定的,在所有情况下运行时都会不同,基本上我不想硬编码。
实现这一目标的最简单和更干净的方法是什么

谢谢。

你试过了吗

URL some=Test.class.getClass().getClassLoader().getResource("org/abc/bm/TestFile.xml");
File file = new File(some.getFile());
你试过了吗

URL some=Test.class.getClass().getClassLoader().getResource("org/abc/bm/TestFile.xml");
File file = new File(some.getFile());

在这种情况下,应该从类路径加载它

在CheckTest.java中,尝试

FileInputStream fileIs = new FileInputStream(CheckTest.class.getClassLoader().getResourceAsStream("org/abc/bm/TestFile.xml");

在这种情况下,应该从类路径加载它

在CheckTest.java中,尝试

FileInputStream fileIs = new FileInputStream(CheckTest.class.getClassLoader().getResourceAsStream("org/abc/bm/TestFile.xml");

使用System.getProperty获取base dir,或者在应用程序启动期间设置base.dir

java -Dbase.dir=c:\User\pkg 

System.getProperty("base.dir");
和使用

System.getProperty("file.separator");

使用System.getProperty获取base dir,或者在应用程序启动期间设置base.dir

java -Dbase.dir=c:\User\pkg 

System.getProperty("base.dir");
和使用

System.getProperty("file.separator");
实现这一目标的最简单和更干净的方法是什么

要访问静态资源,请使用:

URL urlToResource = this.getClasS().getResource("path/to/the.resource");
如果资源需要更改,请将其写入user.home的子目录,以便以后查找

实现这一目标的最简单和更干净的方法是什么

要访问静态资源,请使用:

URL urlToResource = this.getClasS().getResource("path/to/the.resource");

如果资源需要更改,请将其写入user.home的子目录,以便以后查找。

首先,在运行时无法获取对源文件路径的引用

但是,您可以访问类路径中包含的资源(您将在其中编译.class文件)

通常情况下,编译器会将srouce目录中包含的xml文件复制到build目录中,因此最终您可能会得到如下结果:

C:/Workspace/Appl/classes/org/abc/bm/TestFile.xml  
C:/Workspace/Appl/classes/org/abc/bm/tests/CheckTest.class
然后,当类路径指向编译后的类根目录时,使用方法(或等效方法)从该目录获取资源


首先,您无法在运行时获取对源文件路径的引用

但是,您可以访问类路径中包含的资源(您将在其中编译.class文件)

通常情况下,编译器会将srouce目录中包含的xml文件复制到build目录中,因此最终您可能会得到如下结果:

C:/Workspace/Appl/classes/org/abc/bm/TestFile.xml  
C:/Workspace/Appl/classes/org/abc/bm/tests/CheckTest.class
然后,当类路径指向编译后的类根目录时,使用方法(或等效方法)从该目录获取资源

我们可以这样做:

String pathOfTheCurrentClass = this.getClass().getResource(".").getPath();        
File file = new File(pathOfTheCurrentClass + "/..", "Testfile.xml");

但正如Tomas Naros所指出的,这将为您提供位于构建路径中的文件。

可以这样做:

String pathOfTheCurrentClass = this.getClass().getResource(".").getPath();        
File file = new File(pathOfTheCurrentClass + "/..", "Testfile.xml");


但正如Tomas Naros指出的那样,这将为您提供位于构建路径中的文件。

这将失败,因为getFile只返回文件名,而不是文件对象本身。如果您执行Test.class.getClass().getclassLoader(),您将得到java.lang.class对象的类加载器,而不是Test的类加载器。我们忘了前面提到的,我使用
this.getClass()
以及它的工作原理尝试了这种方法。这将失败,因为getFile只返回文件名,而不是文件对象本身。如果您执行Test.class.getClass().getclassLoader(),您将得到java.lang.class对象的类装入器,而不是Test的类装入器。我们忘了前面提到的,我用
this.getClass()
和它的工作原理尝试了这种方法。@Andrew Thompson@Nishan-我现在已经尝试了这两种方法,它们都有效了。使用任何一种方法都有任何特殊的优点/缺点?每种方法都依赖于一个基本原则——从类路径加载。因此,它们中的任何一个都应该对您有好处,而不是直接从硬编码的文件路径加载。但是,如果您只想读取文件,则首先不需要创建文件对象。只需使用我指出的
FileInputStream
方法即可。非常感谢,这确实有帮助。@Andrew Thompson@Nishan-我现在已经尝试了这两种方法,它们都有效。使用任何一种方法都有任何特殊的优点/缺点?每种方法都依赖于一个基本原则——从类路径加载。因此,它们中的任何一个都应该对您有好处,而不是直接从硬编码的文件路径加载。但是,如果您只想读取文件,则首先不需要创建文件对象。只需使用我指出的
FileInputStream
方法即可。非常感谢,这确实有帮助。