我必须读取包含字符串列表的文件。我正试图遵循this post中的建议。两种解决方案都需要使用FileUtils.readLines
,但使用String
,而不是File
作为参数。
Set<String> lines = new HashSet<String>(FileUtils.readLines("foo.txt"));
我需要File
。
This post 将成为我的问题,除了OP被完全禁止使用文件。如果我想使用Apache方法,我需要一个文件,这是我最初解决问题的首选方法。
我的文件很小(一百行左右)和每个程序实例的单例,所以我不需要担心在内存中有另一个文件副本。因此,我可以使用更基本的方法来读取文件,但到目前为止看起来FileUtils.readLines
可能更清晰。我如何从资源到文件。
答案 0 :(得分:10)
Apache Commons-IO有一个IOUtils class和一个FileUtils,其中包含一个类似于FileUtils中的readLines
method。
因此,您可以使用getResourceAsStream
或getSystemResourceAsStream
并将结果传递给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"));