【问题标题】:Java - Get file from jarJava - 从 jar 中获取文件
【发布时间】:2018-06-19 12:50:30
【问题描述】:

我需要在应用程序中捕获一些目录。为此,我做了一个小演示:

String pkgName = TestClass.class.getPackage().getName();
String relPath = pkgName.replace(".", "/");
URL resource = ClassLoader.getSystemClassLoader().getResource(relPath);

File file = new File(resource.getPath());
System.out.println("Dir exists:" + file.exists());

从 IDE 运行应用程序时,我收到了我的目标,我可以找到我的目录。但是将应用程序作为 JAR 文件运行,不会返回有效的“文件”(从 Java 的角度来看),我的 sout 还给了我File exists:false。有没有办法得到这个文件?在这种情况下,文件是一个目录。

【问题讨论】:

  • 你能检查一下 System.out.println(new File(".").getAbsolutePath()); 的输出吗?在这两种情况下。并将其添加到评论中。
  • System.out.println(new File(".").getAbsolutePath()); 总是返回项目文件夹的绝对路径,例如在 Windows 'C:\Users\name\path\to\project\folder\.'

标签: java file jar ide


【解决方案1】:

Java ClassPath 是一种不同于文件系统抽象的抽象。 类路径元素可能以两种物理方式存在:

  1. 用指向根目录的类路径展开
  2. 打包在 JAR 档案中

不幸的是,如果类路径指向文件系统,file.getPath 确实会返回 File 对象,但如果您引用 JAR 文件,则不会返回。

在 99% 的情况下,您应该使用 InputStream 读取资源的内容。

这是一个 sn-p,它使用 apache commons-io 中的 IOUtils 将整个文件内容加载到 String 中。

public static String readResource(final String classpathResource) {
    try {
        final InputStream is = TestClass.class.getResourceAsStream(classpathResource);
        // TODO verify is != null
        final String content = IOUtils.toString(
            is, StandardCharsets.UTF_8);
        return content;
    } catch (final IOException e) {
        throw new UncheckedIOException(e);
    }
}

【讨论】:

  • 我怀疑这仅适用于文件是真实文件,例如文件.txt。但不适用于目录。我对吗?无论哪种方式,我都不想使用外部库。 - 但非常感谢您的回答。
  • 你想用“目录”做什么? ClassPaths 没有“目录”的概念,因此您不能例如列出目录中的所有文件。您只能拥有由诸如“com/foo/file.txt”之类的资源字符串标识的资源。如果不想使用 IOUtils,可以直接通过 InputStream 的接口访问(阅读这里grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/…)。
  • 非常感谢! InputStream 是处理应用程序中资源的一个非常好的选择,它甚至应该作为 JAR 文件运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2011-04-25
  • 2019-11-08
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多