import org.apache.commons.io.input.ReversedLinesFileReader;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ReverseFileReadTest {
private static List<String> readLastLines(File file, int lineNum) {
List<String> result = new ArrayList<>();
try (ReversedLinesFileReader reader = new ReversedLinesFileReader(file)) {
String line = "";
while ((line = reader.readLine()) != null && result.size() < lineNum) {
result.add(line);
} catch (IOException e) {
e.printStackTrace();
Collections.reverse(result);
return result;
public static void main(String[] args) {
readLastLines(new File("/data/log.json"), 100);
最近线上有一个需求,下载系统日志,但是由于tomcat 日志比较大,超过 几百兆甚至几个G。如果用传统方法,将日志文件读取到内存,显然是有问题的。
下面提供一种 截取日志最后N行而不会导致内存溢出的方法。使用commons.io 包的ReversedLinesFileReader对象。
代码如下:
package ygw.study.play;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.input.R.
1、首先在pom文件导入依赖
<!--在Java中,我们可以使用 Apache Commons IO 的 ReversedLinesFileReader 类读取文件的最后几行。 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
Java读取文件最后几行
项目里需要读取最新的日志,可是最新的日志都在文件的最后几行,所以有了这个需求。
百度之后先研究了别人的代码,感觉一是逻辑不太好理解,二是代码偏向于测试,没有办法哪来就用。
所以自己写了这个方法,希望可以给看到的同学带来帮助。也算我自己的一点积累吧。
* 读取文件最后几行
* @param filename
* @param rows
* @thr...
1、概述本教程将演示如何用Java高效地读取大文件。这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分。2、在内存中读取读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:Files.readLines(newFile(path),Charsets.U...
当我们在读取文件的时候,通常都是从前向后读取,那如果要读取文件的最后一行内容,要如何操作呢?
顺序遍历读取,直到文件最后一行
public static String readLastLineV0(File file) {
String lastLine = "";
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
String currentLine = "";
指定行数,可以获取到从这行到文件尾的所有行,分享自大熊。源文件:读取最后10行结果import java.io.File;import java.io.IOException;import java.io.RandomAccessFile;import java.util.ArrayList;import java.util.List;/**** 文件读取类** @author 大熊 www.z...
http://www.iteye.com/problems/42748
public static void main(String[] args) throws Exception {
File file = new File("E:/a.txt"); // 100M
long start = System.currentTimeMillis();
String la...
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class ReverseRead {
public static void main(String[] args) {
//调用读取方法,定义文件以及读取行数
List list = readLastNLine(new File("D:/1.txt"), 5L);
if (list != null
如果你使用的是RandomAccessFile ,你可以使用length和seek来到达文件末尾的特定点,然后从那里读取。如果发现没有足够的线条,请从这一点开始备份并重试。 一旦你知道了第N行的起始位置,你就可以到那里去阅读和打印。根据您的数据属性可以进行最初的猜测。 例如,如果是文本文件,则行长度可能不会超过平均值132,因此,要获取最后五行,请在结束之前启动660个字符。 那么,如果你错了,就...