【问题标题】:Unable to create File object for a file in Jar无法为 Jar 中的文件创建文件对象
【发布时间】:2011-03-05 20:58:45
【问题描述】:

我试图在我的可运行 .jar 文件中包含一些文本文件作为资源。以下代码应打印一个文件的内容:

URI resourceFile = Driver.class.getResource("/etc/inputfile.txt").toURI();
System.out.println("Opening URI: " + resourceFile.toString());
File infile = new File(resourceFile);

Scanner sc = new Scanner(infile);
while (sc.hasNextLine())
    System.out.println(sc.nextLine());
sc.close();

导出为可运行jar后,运行时得到如下输出:

打开 URI:rsrc:etc/inputfile.txt
java.lang.IllegalArgumentException:URI 不是分层的 在 java.io.File.(File.java:363)

如果我使用 getResourceAsStream 可以毫无问题地打印文件,但出于其他原因我想使用 File 对象。
我该如何解决这个问题?

谢谢,
马丁

【问题讨论】:

标签: java jar distribution


【解决方案1】:

仅当方案为file: 时,URI 才表示“文件”。 构造函数File(URI) 对此很清楚。 您不能将 jar 中的打包文件视为文件,因为...它不是 Java 认为的 File:阅读 what the File class represents 的定义:

文件的抽象表示和 目录路径名

如你所说,阅读方式是getResourceAsStream()

【讨论】:

  • 好的,谢谢。您是否知道任何有助于抽象这一点的开源框架,以便我可以同等对待文件和 jar 流?
  • 我为此使用URL(或URI)。它可以被认为是一种概括,包括文件(方案file:)和罐子内的资源(方案jar:)作为特例。但请记住:java File 在概念上只是路径,将其视为文件名。它是资源的标识符(不一定打开,甚至可能不存在)。不要将该概念与文件内容混为一谈。流就是内容。
【解决方案2】:

你不能。 java.io.File 是对文件系统上路径和路径名的抽象。如果要引用 JAR 中的文件,则需要使用 URL 域。

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 2019-10-18
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多