【问题标题】:How can I save a file to the class path [closed]如何将文件保存到类路径[关闭]
【发布时间】:2011-06-10 12:31:37
【问题描述】:

如何保存/加载位于我的类所在的文件? 我之前没有到那个位置的物理路径,我想动态地找到那个文件。

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

【问题讨论】:

  • 这是您在构建过程中想要做的事情吗(即 ant build)?
  • 基本上我有一个要读取和写入的 xml 文件,但我不确定是否应该将其作为文件方法的路径。

标签: java file-io classpath


【解决方案1】:

使用ClassLoader#getResource()getResourceAsStream() 从类路径中以URLInputStream 的形式获取它们。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/file.ext");
// ...

或者如果和当前类在同一个包中,也可以通过如下方式获取:

InputStream input = getClass().getResourceAsStream("file.ext");
// ...

储蓄是另一回事。如果文件位于 JAR 文件中,这将不起作用。如果可以确保文件已展开且可写,则将URLgetResource() 转换为File

URL url = classLoader.getResource("com/example/file.ext");
File file = new File(url.toURI().getPath());
// ...

然后你可以用它构造一个FileOutputStream

相关问题:

【讨论】:

  • url.toURI() - 如果文件不存在,将会有NullPointerException
  • @naXa:没错。如果您不确定,请事先检查 url 是否不是 null。对于您尝试使用句点运算符. 访问的任何其他Java 变量,它并没有什么不同。每个自尊的 Java 开发人员都知道这一点。
  • 这回答了如何更新存在于类路径中的文件,但由于getResource 返回 null,因此不允许您创建文件。
  • 使用URI的对应,是你必须捕获URISyntaxException
【解决方案2】:

如果您的类是从文件系统加载的,您可以尝试以下方法。

String basePathOfClass = getClass()
   .getProtectionDomain().getCodeSource().getLocation().getFile();

要获取该路径中的文件,您可以使用

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

【讨论】:

  • 您的代码进入项目的根目录,因此如果您想访问包中的特定文件,只需添加(到您的代码中): + "/" + fileName;
  • 这对我有用,其他人没有。我会将其添加到答案中:File file = new File(basePathOfClass + "Filename.txt");
【解决方案3】:

new File(".").getAbsolutePath() + "relative/path/to/your/files";

【讨论】:

  • 最好能评论一下你为什么给答案负1
  • 这可能是因为这基本上取决于当前工作目录,而不是类路径。工作目录本身不是类路径根目录,更重要的是,这在程序内部是无法控制的。这完全取决于您启动程序的方式,因此这太容易出错了。
  • 可以理解,但它对我来说已经足够好了。但对每个人来说,他们自己的。
【解决方案4】:

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

【讨论】:

  • 我不明白为什么这个问题被标记为正确。
  • @RafaelRuizTabares 这是一个答案。
  • 我知道@karna。但问题是为什么?因为我认为这是一个空洞的答案。否则Baluc的答案更完整。
  • @RafaelRuizTabares 只有 OP 才能回答
  • @RafaelRuizTabares 完全同意你的观点,BalusC 的答案更完整,但我想我给出的答案是,在一般情况下你不能保存到类路径,因为它可以在任何可能的介质上,大多数可能不支持写操作。
【解决方案5】:

这是对彼得回应的扩展:

如果您希望文件与当前类位于相同的类路径中(例如: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);
}

【讨论】:

    【解决方案6】:

    根据system properties documentation,您可以将其作为“java.class.path”属性访问:

    string classPath = System.getProperty("java.class.path");
    

    【讨论】:

    • 还不够,因为它不会告诉您从类路径的哪个部分加载类。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多