8

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

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

我需要一个File.

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

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

4

3 回答 3

12

Apache Commons-IO 有一个IOUtils 类以及一个 FileUtils,其中包含一个类似于FileUtils 中的readLines方法。

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

List<String> myLines = IOUtils.readLines(ClassLoader.getSystemResourceAsStream("my_data_file.txt"));
于 2013-08-28T21:43:34.057 回答
2

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

尝试以下使用ClassLoader,其中resourceString类路径中资源文件路径的表示形式。

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().

于 2013-08-28T20:32:07.383 回答
0

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

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

使用输入流:

List<String> listContents = 
 IOUtils.readLines(
  this.getClass().getResourceAsStream("/myfile.log"));
于 2014-08-29T18:20:07.610 回答