2011-03-11 48 views
0


我在父目录的一个访问文件的这个问题上创建文件的文件对象。
为了解释,考虑下面的目录结构: -从父目录在java中

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()等,但变得有点复杂,坦率地说,我想我搞砸了。
我之所以不想在创建File实例使用"C:/Workspace/Appl/src/org/abc/bm"是因为C:/Workspace/Appl不是固定的,在所有的情况下会在运行时不同,基本上我不想硬编码。
什么可能是最容易和更干净的方式来实现这一目标?

谢谢。

回答

3

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

在你CheckTest.java,尝试

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

@Andrew Thompson @Nishan - 我现在已经尝试了这两个,他们的工作。使用任何一种方式的特定优势/劣势? – 2011-03-11 11:07:17

+0

这些都依赖于一个基本原则 - 从classpath加载。所以,它们中的任何一个都应该对你有用,而不是直接从硬编码文件路径加载。 – adarshr 2011-03-11 11:09:30

+0

但是,如果您只想读取文件,则无需首先创建File对象。请使用我已经指出的FileInputStream方法。 – adarshr 2011-03-11 11:10:25

-2

你尝试

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

这将失败,因为getFile只返回文件的名称,而不是File对象本身 – 2011-03-11 11:02:04

+1

如果您执行Test.class.getClass()。getclassLoader(),您将得到java.lang的类加载器.Class对象,而不是Test的。 – adarshr 2011-03-11 11:11:45

+0

早先忘了提到,我用'this.getClass()'试过这种方式,它是如何工作的。 – 2011-03-11 11:19:54

1

应该使用System.getProperty得到基本目录或您在应用程序启动设置base.dir

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

System.getProperty("base.dir"); 

,并使用

System.getProperty("file.separator"); 
1

什么能实现这一目标的最简单和干净的方式?

对于访问静态资源的使用:

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

如果该资源预期发生变化,它写的user.home的子目录,它是便于以后查找。

0

首先,你不能去上运行的源文件路径的参考。

但是,您可以访问包含在类路径中resrources(你遵守.class文件会)。

通常情况下,你的编译器将复制的XML文件包含在你的srouce目录到构建目录,所以在最后,你可能最终有这样的事情:

C:/Workspace/Appl/classes/org/abc/bm/TestFile.xml 
C:/Workspace/Appl/classes/org/abc/bm/tests/CheckTest.class 

然后,用你的类路径指向编译的类根目录,您可以使用ClassLoader.getResource方法(或等效的Class.getResource()方法)从此目录获取资源。

public class Check { 
    public void checkMethod() { 
     java.net.URL fileURL=this.getClass().getResource("/org/abc/bm/tests/TestFile.xml"); 

     File f=new File(fileURL.toURI()); 

    } 
} 
0

一个可以这样做:

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

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

但正如托马斯Naros指出,这给你定位于构建路径的文件。