java实现倒序读取文件功能示例分享

时间:2023-07-12 09:23:54 

Long end,long num,File file,String charset
4个参数说明
end 相当于坐标 ,tail 向上的起点,num是读取的行数,file 目标文件 charset字符集 默认UTF8
end 为 null 代表从 文件 最末端 向上 获取。

Map m=FileUtil.tail(null,10,file,null)//读取文件最后10行,结果在 m.get(FileUtil.ARR) 里
FileUtil.tail(m.get(FileUtil.POINT),3,file,null)//读取文件倒数 11行到13行,其实就是接着上边的第10行再向上读3行


public class FileUtil {

    private static final long step=5000;

    public static final String ARR="arr";
    public static final String POINT="point";

    public static Map tail(Long end,long num,File file,String charset)throws Exception{
        if(num<=0||(end!=null&&end<0)){
            throw new IllegalArgumentException();
        }
        Map map=new HashMap();
        RandomAccessFile acc=null;
        try {
            acc = new RandomAccessFile(file, "r");
            long temp_end = (end == null ? acc.length() : end);
            long my_point = temp_end > step ? (temp_end-step) : 0;
            acc.seek(my_point);
            LinkedList<Object[]> queue = new LinkedList<Object[]>();
            String temp;
            int n=0;
            while((temp=acc.readLine())!=null){
                if(++n==1&&my_point!=0){
                    continue;
                }
                Object[]  objects=new Object[2];
                long point = acc.getFilePointer();
                if(point>=temp_end&&end!=null){break;}
                objects[0]=point;
                objects[1]=new String(temp.getBytes("8859_1"),charset);
                if(queue.size()==num){
                    queue.poll();
                }
                queue.offer(objects);
            }

            if(queue.size()<num&&my_point>0){
                long last_num=num-queue.size();
                Object[] header = queue.peek();
                if(header==null){throw new RuntimeException("FileUtil step:"+step+" not enough long");}
                Map m = tail((Long)header[0], last_num, file,charset);
                map.put(POINT,m.get(POINT));
                map.put(ARR,ArrayUtils.addAll((Object[])m.get(ARR),queue.toArray()));
            }else if(queue.size()>0){//获取的行数不够,并且没有到达TOP
                map.put(POINT,queue.peek()[0]);
                map.put(ARR,queue.toArray());
            }
        }finally {
            if(acc!=null){
                try {
                    acc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return map;
    }


}

标签:java,文件
0
投稿

猜你喜欢

  • Java OpenCV图像处理之仿射变换,透视变换,旋转详解

    2022-04-18 23:56:01
  • Android6.0仿微信权限设置

    2023-03-03 09:40:30
  • Android Studio实现补间动画

    2022-07-01 11:09:44
  • 通过Java连接SQL Server数据库的超详细操作流程

    2022-08-01 12:46:01
  • .net中常用的正则表达式

    2021-06-12 00:15:44
  • Android开发之DatePickerDialog、TimePickerDialog时间日期对话框用法示例

    2022-10-25 21:21:12
  • C# Winform自动更新程序实例详解

    2021-12-06 05:52:57
  • Intellij IDEA 阅读源码的 4 个绝技(必看)

    2023-06-14 11:23:16
  • mybatis注入Date日期值为null的解决方法

    2021-12-08 01:49:17
  • 详解C#实现MD5加密的示例代码

    2023-11-28 21:01:54
  • Android实现简洁的APP更新dialog数字进度条

    2023-01-29 18:53:39
  • 解决CollectionUtils.isNotEmpty()不存在的问题

    2021-11-15 12:03:17
  • C#实现单词本功能

    2021-11-06 13:08:23
  • 详解android6.0版本下悬浮窗实现

    2023-09-04 18:43:34
  • 如何解决Mybatis--java.lang.IllegalArgumentException: Result Maps collection already contains value for X

    2022-03-20 10:35:44
  • SpringBoot配置GlobalExceptionHandler全局异常处理器案例

    2023-06-11 12:14:36
  • android中图形图像处理之drawable用法分析

    2023-01-13 07:45:03
  • C# menuStrip控件实现鼠标滑过自动弹出功能

    2022-09-01 05:18:37
  • c#创建Graphics对象的三种方法

    2022-11-24 10:20:53
  • Java数据结构学习之二叉树

    2023-04-25 12:08:27
  • asp之家 软件编程 m.aspxhome.com