Java从后向前读取TXT文件

2019-03-08  本文已影响0人  NightingCrow

/**

* 读取最后几行

*

* @param file    文件

* @param charset  编码

* @param n        条数

* @param positive 是否正序

* @return ArrayList<String>

*/

public static ArrayList<String> tail(File file, int n, Charset charset, boolean positive) {

    ArrayList<String> arrayList = new ArrayList<>();

    RandomAccessFile randomAccessFile = null;

    try {

        randomAccessFile = new RandomAccessFile(file, "r");

        //获取文件长度

        long length = randomAccessFile.length();

        //如果长度小于1,则说明文件为空

        if (length < 1) {

            return arrayList;

        }

        long available = length - 1;

        //标记文件最后位置

        randomAccessFile.seek(available);

        for (int i = 0; i < n && available > 0; i++) {

            if (available == length - 1) {

                available--;

                randomAccessFile.seek(available);

            }

            int c = randomAccessFile.read();

            while (c != '\n' && available > 0) {

                available--;

                randomAccessFile.seek(available);

                c = randomAccessFile.read();

            }

            //标记当前位置

            long nowPointer = randomAccessFile.getFilePointer();

            String line = new String(randomAccessFile.readLine().getBytes(), charset);

            arrayList.add(line);

            if (nowPointer > 1) {

                randomAccessFile.seek(nowPointer - 2);

            }

        }

        if (!positive) {

            Collections.reverse(arrayList);

        }

        return arrayList;

    } catch (Exception e) {

        e.printStackTrace();

    } finally {

        try {

            assert Objects.nonNull(randomAccessFile);

            randomAccessFile.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    return arrayList;

}

上一篇下一篇

猜你喜欢

热点阅读