Java 如何将文件保存到类路径

Java 如何将文件保存到类路径,java,file-io,classpath,Java,File Io,Classpath,如何保存/加载位于类所在位置的文件? 我以前不知道该位置的物理路径,我希望动态查找该文件 我想加载一个XML文件并对其进行读写,但我不确定如何处理它。新文件(“.”)。getAbsolutePath()+“relative/path/to/your/files”在一般情况下,您不能。从类加载器加载的资源可以是任何内容:目录中的文件、嵌入jar文件中的文件,甚至是通过网络下载的文件。根据,您可以通过“java.class.path”属性访问: string classPath = System.g

如何保存/加载位于类所在位置的文件? 我以前不知道该位置的物理路径,我希望动态查找该文件


我想加载一个XML文件并对其进行读写,但我不确定如何处理它。

新文件(“.”)。getAbsolutePath()+“relative/path/to/your/files”

在一般情况下,您不能。从类加载器加载的资源可以是任何内容:目录中的文件、嵌入jar文件中的文件,甚至是通过网络下载的文件。

根据,您可以通过“java.class.path”属性访问:

string classPath = System.getProperty("java.class.path");
使用或从类路径以
URL
InputStream
的形式获取它们

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/file.ext");
// ...
或者,如果它与当前类位于同一个包中,您也可以按如下方式获取它:

InputStream input = getClass().getResourceAsStream("file.ext");
// ...
储蓄是另一回事。如果文件位于JAR文件中,这将不起作用。如果可以确保文件已展开且可写,则将
URL
getResource()
转换为
文件

URL url = classLoader.getResource("com/example/file.ext");
File file = new File(url.toURI().getPath());
// ...
然后可以用它构造一个

相关问题:

如果您的类是从文件系统加载的,则可以尝试以下操作

String basePathOfClass = getClass()
   .getProtectionDomain().getCodeSource().getLocation().getFile();
要获取该路径中的文件,可以使用

File file = new File(basePathOfClass, "filename.ext");

这是对Peter回应的扩展:

如果希望文件与当前类位于相同的类路径中(例如:项目/类):

如果希望文件位于不同的类路径(例如:proget/test classes),只需将
this.getClass()
替换为类似
TestClass.class
的内容即可

从类路径读取属性: 将属性写入类路径: 在类路径上创建文件对象:
这是您在构建过程(即ant build)中想要做的事情吗?基本上,我有一个xml文件要读和写,我不确定是否应该将其作为文件方法的路径。请评论一下为什么您给出的答案为-1,这可能是因为这基本上取决于当前的工作目录,不在类路径上。工作目录本身不是类路径根,而且,这在程序内部是无法控制的。这完全取决于你启动程序的方式,因此这太容易出错。可以理解,但对我来说已经足够好了。但对每个人来说,他们自己的。这是不够的,因为它不会告诉你类从类路径的哪个部分加载。我不明白为什么这个问题被标记为正确。@RafaelRuizTabares这是一个答案。我知道@karna。但问题是为什么?因为我认为这是一个空洞的答案。否则,巴鲁克的答案就更完整了。@RafaelRuizTabares,只有OP才能回答answer@RafaelRuizTabares完全同意你的说法,BalusC的答案更完整,但我想我给出了一个答案,在一般情况下,你不能保存到类路径,因为它可以在任何可能的媒体上,很可能不支持写操作。
url.toURI()
-如果文件不存在,将出现
NullPointerException
。@naXa:正确。只需事先检查
url
是否为
null
,以防您不确定。对于您试图使用句点运算符
访问的任何其他Java变量来说,这没有什么不同。每个自尊心很强的Java开发人员都知道这一点。这回答了如何更新类路径上存在的文件,但由于
getResource
返回null,因此不允许您创建文件。使用URI的对应方法是,您必须捕获
urisyntaxeption
。您的代码进入项目的根目录,因此,如果您想访问包中的特定文件,只需添加(到代码中):+“/”+文件名;这对我有效,对其他人无效。我想在答案中添加以下内容:
File File=new File(basePathOfClass+“Filename.txt”)
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);
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);
}