【问题标题】:How do I get a Java resource as a File?如何将 Java 资源作为文件获取?
【发布时间】:2013-09-01 02:17:11
【问题描述】:

我必须读取一个包含字符串列表的文件。我正在尝试遵循this post 中的建议。两种解决方案都需要使用FileUtils.readLines,但使用String,而不是File 作为参数。

Set<String> lines = new HashSet<String>(FileUtils.readLines("foo.txt"));

我需要File

This post 是我的问题,除了 OP 被劝阻不要完全使用文件。如果我想使用 Apache 方法,我需要一个文件,这是我最初问题的首选解决方案。

我的文件很小(大约一百行),每个程序实例只有一个,所以我不需要担心在内存中还有另一个文件副本。因此我可以使用更基本的方法来读取文件,但到目前为止看起来FileUtils.readLines 可能会更干净。我如何从资源转到文件。

【问题讨论】:

  • 如果它是一个类路径资源,你不应该使用File 类型。考虑使用 Google 的 Guava library Resources.readLines 方法。

标签: java file jar resources


【解决方案1】:

Apache Commons-IO 有一个IOUtils class 和一个 FileUtils,其中包括一个类似于 FileUtils 中的readLines method

因此您可以使用getResourceAsStreamgetSystemResourceAsStream 并将结果传递给IOUtils.readLines 以获取文件内容的List&lt;String&gt;

List<String> myLines = IOUtils.readLines(ClassLoader.getSystemResourceAsStream("my_data_file.txt"));

【讨论】:

  • 大声笑,所以另一个问题接受了绕过获取文件问题的答案。 Java 显然不喜欢 File。
  • 与此无关。文件与系统无关,流是。
  • @djechlin a File 是文件系统中具有路径的实际文件。资源可以是 jar 文件的一部分,您不能通过路径仅引用 jar(或 zip)的一部分。您可以做的是获取一个流到一个真实文件或一个流到一个压缩文件中的压缩文件,这些文件也可以即时解压缩。
  • @zapl 哦,我明白了。谢谢,现在说得通了。
【解决方案2】:

我假设您要读取的文件是类路径上的真实资源,而不仅仅是您可以通过 new File("path_to_file"); 访问的任意文件。

使用ClassLoader 尝试以下操作,其中resource 是类路径中资源文件路径的String 表示。

resource 的有效 String 值可以包括:

  • "foo.txt"
  • "com/company/bar.txt"
  • "com\\company\\bar.txt"
  • "\\com\\company\\bar.txt"

并且路径不限于com.company

获取不在 JAR 中的 File 的相关代码:

File file = null;

try {

    URL url = null;
    ClassLoader classLoader = {YourClass}.class.getClassLoader(); 

    if (classLoader != null) {

        url = classLoader.getResource(resource);
    }

    if (url == null) {

        url = ClassLoader.getSystemResource(resource);
    }

    if (url != null) {

        try {

            file = new File(url.toURI());

        } catch (URISyntaxException e) {

            file = new File(url.getPath());
        }
    }

} catch (Exception ex) { /* handle it */ }

// file may be null

或者,如果您的资源在 JAR 中,则必须使用 Class.getResourceAsStream(resource); 并使用 BufferedReader 循环浏览文件以模拟对 readLines() 的调用。

【讨论】:

  • 资源应该是字符串,例如"/com/mysite/app/file.txt"?
  • 不,不是前面的/。我已经在 Windows 7 上对其进行了测试,并使用我成功的测试用例进行了更新。不适用于 . 作为路径分隔符。
  • 在查看了 stackoverflow.com/questions/676097/java-resource-as-file 之后,其中一个替代答案与我的答案相似,但范围不广。
  • new File(url.toURI()) 会为 JAR 文件中的资源工作吗?
  • 这正是我要更新的内容;可能必须使用getResourceAsStream()BufferedReader 来代替对FileUtils 的调用。
【解决方案3】:

使用资源读取文件到字符串:

String contents = 
 FileUtils.readFileToString(
  new File(this.getClass().getResource("/myfile.log").toURI()));

使用输入流:

List<String> listContents = 
 IOUtils.readLines(
  this.getClass().getResourceAsStream("/myfile.log"));

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2016-08-06
    • 2016-02-11
    相关资源
    最近更新 更多