java读取文件后n行

来源:互联网 发布:tcp压力测试工具 mac 编辑:程序博客网 时间:2024/05/20 23:57
public class ReadFile {    //Main函数,程序入口    public static void main(String[] args) {        //调用读取方法,定义文件以及读取行数        List<String> list = readLastNLine(new File("D:/1.txt"), 5L);        if (list != null) {            for (String str : list) {                System.out.println(str + "<br>");            }        }    }    /**     * 读取文件最后N行     * <p>     * 根据换行符判断当前的行数,     * 使用统计来判断当前读取第N行     * <p>     * PS:输出的List是倒叙,需要对List反转输出     *     * @param file    待文件     * @param numRead 读取的行数     * @return List<String>     */    public static List<String> readLastNLine(File file, long numRead) {        // 定义结果集        List<String> result = new ArrayList<String>();        //行数统计        long count = 0;        // 排除不可读状态        if (!file.exists() || file.isDirectory() || !file.canRead()) {            return null;        }        // 使用随机读取        RandomAccessFile fileRead = null;        try {            //使用读模式            fileRead = new RandomAccessFile(file, "r");            //读取文件长度            long length = fileRead.length();            //如果是0,代表是空文件,直接返回空结果            if (length == 0L) {                return result;            } else {                //初始化游标                long pos = length - 1;                while (pos > 0) {                    pos--;                    //开始读取                    fileRead.seek(pos);                    //如果读取到\n代表是读取到一行                    if (fileRead.readByte() == '\n') {                        //使用readLine获取当前行                        String line = new String(fileRead.readLine().getBytes("ISO-8859-1"), "utf-8");                        //保存结果                        result.add(line);                        //打印当前行                        //System.out.println(line);                        //行数统计,如果到达了numRead指定的行数,就跳出循环                        count++;                        if (count == numRead) {                            break;                        }                    }                }                if (pos == 0) {                    fileRead.seek(0);                    result.add(fileRead.readLine());                }            }        } catch (IOException e) {            e.printStackTrace();        } finally {            if (fileRead != null) {                try {                    //关闭资源                    fileRead.close();                } catch (Exception e) {                }            }        }        Collections.reverse(result);        return result;    }}
0 0