【发布时间】:2011-06-10 12:31:37
【问题描述】:
如何保存/加载位于我的类所在的文件? 我之前没有到那个位置的物理路径,我想动态地找到那个文件。
我想加载一个 XML 文件并对其进行读写,但我不知道如何处理它。
【问题讨论】:
-
这是您在构建过程中想要做的事情吗(即 ant build)?
-
基本上我有一个要读取和写入的 xml 文件,但我不确定是否应该将其作为文件方法的路径。
如何保存/加载位于我的类所在的文件? 我之前没有到那个位置的物理路径,我想动态地找到那个文件。
我想加载一个 XML 文件并对其进行读写,但我不知道如何处理它。
【问题讨论】:
使用ClassLoader#getResource() 或getResourceAsStream() 从类路径中以URL 或InputStream 的形式获取它们。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/file.ext");
// ...
或者如果和当前类在同一个包中,也可以通过如下方式获取:
InputStream input = getClass().getResourceAsStream("file.ext");
// ...
储蓄是另一回事。如果文件位于 JAR 文件中,这将不起作用。如果可以确保文件已展开且可写,则将URL 由getResource() 转换为File。
URL url = classLoader.getResource("com/example/file.ext");
File file = new File(url.toURI().getPath());
// ...
然后你可以用它构造一个FileOutputStream。
【讨论】:
url.toURI() - 如果文件不存在,将会有NullPointerException。
url 是否不是 null。对于您尝试使用句点运算符. 访问的任何其他Java 变量,它并没有什么不同。每个自尊的 Java 开发人员都知道这一点。
getResource 返回 null,因此不允许您创建文件。
URISyntaxException。
如果您的类是从文件系统加载的,您可以尝试以下方法。
String basePathOfClass = getClass()
.getProtectionDomain().getCodeSource().getLocation().getFile();
要获取该路径中的文件,您可以使用
File file = new File(basePathOfClass, "filename.ext");
【讨论】:
File file = new File(basePathOfClass + "Filename.txt");
new File(".").getAbsolutePath() + "relative/path/to/your/files";
【讨论】:
一般情况下你不能。从类加载器加载的资源可以是任何东西:目录中的文件、嵌入 jar 文件中的文件,甚至是通过网络下载的文件。
【讨论】:
这是对彼得回应的扩展:
如果您希望文件与当前类位于相同的类路径中(例如:project/classes):
URI uri = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI();
File file = new File(new File(uri), PROPERTIES_FILE);
FileOutputStream out = new FileOutputStream(createPropertiesFile(PROPERTIES_FILE));
prop.store(out, null);
如果您希望文件位于不同的类路径中(例如:progect/test-classes),只需将this.getClass() 替换为TestClass.class。
Properties prop = new Properties();
System.out.println("Resource: " + getClass().getClassLoader().getResource(PROPERTIES_FILE));
InputStream in = getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE);
if (in != null) {
try {
prop.load(in);
} finally {
in.close();
}
}
Properties prop = new Properties();
prop.setProperty("Prop1", "a");
prop.setProperty("Prop2", "3");
prop.setProperty("Prop3", String.valueOf(false));
FileOutputStream out = null;
try {
System.out.println("Resource: " + createPropertiesFile(PROPERTIES_FILE));
out = new FileOutputStream(createPropertiesFile(PROPERTIES_FILE));
prop.store(out, null);
} finally {
if (out != null) out.close();
}
private File createPropertiesFile(String relativeFilePath) throws URISyntaxException {
return new File(new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()), relativeFilePath);
}
【讨论】:
根据system properties documentation,您可以将其作为“java.class.path”属性访问:
string classPath = System.getProperty("java.class.path");
【讨论】: