如何将Java资源作为文件获取?

时间:2013-08-28 20:24:37

标签: java file jar resources

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

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

我需要File

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

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

3 个答案:

答案 0 :(得分:10)

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

因此,您可以使用getResourceAsStreamgetSystemResourceAsStream并将结果传递给IOUtils.readLines,以获取文件内容的List<String>

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

答案 1 :(得分:2)

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

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

String的有效resource值可包括:

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

且路径不限于com.company

使File不在JAR中的相关代码:

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()的调用。

答案 2 :(得分:0)

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

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

使用输入流:

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