Java中逐行读取文本文件
在Java中,可以使用不同的方法逐行读取文本文件。以下是一些逐行读取文件的方法,包括使用Streams或FileReader,并学习如何迭代行并根据某些条件筛选文件内容。
1.使用Files.lines() – 在Java 8中通过文件的行创建Stream
Files.lines()
是Java 8的新功能。它将文件的所有行作为一个Stream进行读取。返回的Stream包含对打开文件的引用。通过关闭流来关闭文件。
重要的是要注意,文件内容不应在终端流操作执行期间被修改,否则终端流操作的结果是未定义的。
作为一种推荐的做法,应该在try-with-resources语句或类似的控制结构中使用Files.lines()
,以确保在流操作完成后及时关闭流中的打开文件。
Path filePath = Paths.get("c:/temp", "data.txt"); try (Stream<String> lines = Files.lines( filePath )) { lines.forEach(System.out::println); } catch (IOException e) { //... }
2.读取并筛选行
在此示例中,我们将文件内容作为行的流进行读取。然后,我们将筛选包含单词“password”的所有行。
为了进行筛选,我们传递一个Lambda表达式,这是一个Predicate的实例,给filter()
方法。
Path filePath = Paths.get("c:/temp", "data.txt"); try (Stream<String> lines = Files.lines(filePath)) { List<String> filteredLines = lines .filter(s -> s.contains("password")) .collect(Collectors.toList()); filteredLines.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); }
3.从小文件中读取所有行
如果文件大小较小,可以使用Files.readAllLines()
方法将所有行从文件中读取到一个List中。默认情况下,文件中的字节会使用UTF-8字符集解码为字符。
注意,使用Files.readAllLines
后,不需要显式关闭资源。
Path filePath = Paths.get("c:/temp", "data.txt"); List<String> lines = Files.readAllLines(filePath); for (String line : lines) { System.out.println(line); }
4.使用FileReader逐行读取文件[已过时]
在Java 7之前,我们可以使用FileReader以各种方式读取文件。这只能作为参考,不应在Java 8或更高版本中使用,因为它对此用例没有额外的好处。
File file = new File("c:/temp/data.txt"); try (FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr);) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }
5.Guava的Files.readLines()
最简单的解决方案之一是使用Google Guava的Files类和其readLines()
方法。
try { List<String> lines = com.google.common.io.Files.readLines(file, Charset.defaultCharset()); } catch (IOException e) { e.printStackTrace(); }
如果我们想在读取时处理这些行,可以使用LineProcessor。例如,在下面的代码中,我们将读取的行转换为大写。
// With LineProcessor LineProcessor<List<String>> lineProcessor = new LineProcessor<>() { final List<String> result = new ArrayList<>(); @Override public boolean processLine(final String line) throws IOException { result.add(StringUtils.capitalize(line)); return true; // keep reading } @Override public List<String> getResult() { return result; } }; try { List<String> lines = com.google.common.io.Files .asCharSource(file, Charset.defaultCharset()) .readLines(lineProcessor); } catch (IOException e) { e.printStackTrace(); }
6.Apache Commons IO的FileUtils.readLines()
类似于Guava,Apache Commons IO库中的FileUtils类提供了一种单语句解决方案,用于逐行读取文件内容。操作结束时,文件始终会被关闭。
try { List<String> lines = FileUtils.readLines(file, Charset.defaultCharset()); } catch (IOException e) { e.printStackTrace(); }
这些是逐行读取文件的Java示例。如果有问题,请在评论部分提出。