如何保存/加载位于我的课程所在的文件? 我以前没有到该位置的物理路径,我想动态地找到该文件。
由于
编辑:
我想加载一个XML文件并对其进行写入和读取,我不知道如何解决它。
答案 0 :(得分:36)
使用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
。
答案 1 :(得分:12)
如果您的类是从文件系统加载的,则可以尝试以下操作。
String basePathOfClass = getClass()
.getProtectionDomain().getCodeSource().getLocation().getFile();
要获取该路径中的文件,您可以使用
File file = new File(basePathOfClass, "filename.ext");
答案 2 :(得分:8)
new File(".").getAbsolutePath() + "relative/path/to/your/files";
答案 3 :(得分:6)
在一般情况下你不能。从类加载器加载的资源可以是任何内容:目录中的文件,嵌入在jar文件中的文件,甚至可以通过网络下载。
答案 4 :(得分:4)
这是对彼得回应的扩展:
如果您希望文件与当前类位于同一类路径中(例如: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);
}
答案 5 :(得分:1)
根据system properties documentation,您可以将其作为“java.class.path”属性进行访问:
string classPath = System.getProperty("java.class.path");