如何将文件保存到类路径

Dor*_*nai 14 java file-io classpath

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

谢谢

编辑:

我想加载一个XML文件并写入和读取它,我不知道如何解决它.

Bal*_*usC 38

使用ClassLoader#getResource()getResourceAsStream()获得他们作为URLInputStream从classpath.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/file.ext");
// ...
Run Code Online (Sandbox Code Playgroud)

或者,如果它与当前类位于同一个包中,您也可以按如下方式获取它:

InputStream input = getClass().getResourceAsStream("file.ext");
// ...
Run Code Online (Sandbox Code Playgroud)

拯救是一个独特的故事.如果文件位于JAR文件中,则无效.如果可以确保文件已展开且可写,则将URLfrom 转换getResource()File.

URL url = classLoader.getResource("com/example/file.ext");
File file = new File(url.toURI().getPath());
// ...
Run Code Online (Sandbox Code Playgroud)

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

相关问题:

  • url.toURI()-如果文件不存在,将会出现NullPointerException。 (2认同)
  • @naXa:那是对的.如果你不确定,请事先检查`url`是不是'null`.对于您尝试使用句点运算符`.`访问的任何其他Java变量,它没有什么不同.每个受人尊敬的Java开发人员都知道这一点. (2认同)

Pet*_*rey 12

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

String basePathOfClass = getClass()
   .getProtectionDomain().getCodeSource().getLocation().getFile();
Run Code Online (Sandbox Code Playgroud)

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

File file = new File(basePathOfClass, "filename.ext");
Run Code Online (Sandbox Code Playgroud)


use*_*041 8

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

  • 这很可能是因为这基本上取决于当前的工作目录,而不是类路径.工作目录本身不是类路径根目录,甚至更多,这在程序内部无法控制.它完全取决于您启动程序的方式,因此这很容易出错. (7认同)
  • 工作软件+1是唯一衡量进度的方法 (2认同)

gab*_*uzo 6

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

  • 我不明白为什么这个问题被标记为正确. (5认同)
  • @RafaelRuizTabares完全同意你的看法,BalusC的答案更完整,但我想我给出的答案是,在一般情况下你不能保存到类路径,因为它可以在任何可能的介质上,很可能不支持写操作. (2认同)

Scr*_*Dev 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);
Run Code Online (Sandbox Code Playgroud)

如果您希望文件位于不同的类路径中(例如: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();
    }
}
Run Code Online (Sandbox Code Playgroud)

将属性写入类路径:

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();
}
Run Code Online (Sandbox Code Playgroud)

在类路径上创建文件对象:

private File createPropertiesFile(String relativeFilePath) throws URISyntaxException {
    return new File(new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()), relativeFilePath);
}
Run Code Online (Sandbox Code Playgroud)