java动态获取文件某行内容的前几行,后几行

说明:

java动态获取文件某行内容的前几行,就是当文件读取到该文件的某行内容时,动态获取该行内容的前几行,这里由于业务需要动态获取当7行,和后7行

代码如下:

这里采用  RandomAccessFile 一行一行读取文件。
new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        long now = System.currentTimeMillis();
                        System.out.println("开始检索文件(旧协议)...");
                        //r--以只读的方式打开文本,也就意味着不能用write来操作文件
                        RandomAccessFile raf = new RandomAccessFile(file, "r");

                        //定义个集合缓存10日志信息
                        Map<Integer, String> frontMap = new HashMap<>();
                        Map<Integer, String> afterMap = new HashMap<>();

                        //定义一个标志位,往后的3行数据是我们想要的
                        boolean flag = false;
                        int flagNum = 0;
                        String line;

                        while ((line = raf.readLine()) != null) {
                            lineNum++;
                            //获取读取字节长度,用于进度条显示
                            len += line.length();// 27841772
                            // System.out.println("文件长度为:" + len);


                            frontMap.put((int) lineNum, line);
                            //获取前7行数据
                            //如果想获取7条记录则填9,如果是想获取4条记录则填6,依次递增
                            if (frontMap.size() == 9) {
                                int index = (int) (lineNum + 1) - 9;
                                frontMap.remove(index);
                            }
                            //收集后7段的值
                            if (flag) {
                                flagNum++;
                                afterMap.put(flagNum, line);
                                //System.out.println("stringMap--后7段--" + line);
                                //显示在页面
                                logKeywordTextArea.append(line + "\n\n");
                                if (afterMap.size() == 7) {
                                    logKeywordTextArea.append("==========下一个搜索结果============" + "\n\n");
                                    flag = false;
                                    afterMap.clear();
                                }
                            }


                            if (keyword != null && keyword.length() > 0) {
                                //开始进行关键字检索
                                //TODO 只要文件中包含有该关键字就输出
                                if (line.contains(keyword)) {
                                    //添加日志信息到显示框
                                    //System.out.println("=================开始获取数据===============");
                                    //System.out.println("stringMap--前7段--" + frontMap.get((int) (lineNum - 7)));
                                    //System.out.println("stringMap--前7段--" + frontMap.get((int) (lineNum - 6)));
                                    //System.out.println("stringMap--前7段--" + frontMap.get((int) (lineNum - 5)));
                                    //System.out.println("stringMap--前7段--" + frontMap.get((int) (lineNum - 4)));
                                    //System.out.println("stringMap--前7段--" + frontMap.get((int) (lineNum - 3)));
                                    //System.out.println("stringMap--前7段--" + frontMap.get((int) (lineNum - 2)));
                                    //System.out.println("stringMap--前7段--" + frontMap.get((int) (lineNum - 1)));
                                    //System.out.println("当前段--" + frontMap.get((int) lineNum));
                                    //System.out.println("需要值为:" + line);


                                    logKeywordTextArea.append(frontMap.get((int) (lineNum - 7)) + "\n\n");
                                    logKeywordTextArea.append(frontMap.get((int) (lineNum - 6)) + "\n\n");
                                    logKeywordTextArea.append(frontMap.get((int) (lineNum - 5)) + "\n\n");
                                    logKeywordTextArea.append(frontMap.get((int) (lineNum - 4)) + "\n\n");
                                    logKeywordTextArea.append(frontMap.get((int) (lineNum - 3)) + "\n\n");
                                    logKeywordTextArea.append(frontMap.get((int) (lineNum - 2)) + "\n\n");
                                    logKeywordTextArea.append(frontMap.get((int) (lineNum - 1)) + "\n\n");
                                    //<html><font color=red>##</font></html>   frontMap.get((int) lineNum) + "\n\n"
                                    //logKeywordTextArea.append("<html><font color=red>" + frontMap.get((int) lineNum)  + "</font></html>" + "\n\n");
                                    logKeywordTextArea.append(frontMap.get((int) lineNum) + "\n\n");

                                    flag = true;

                                }
                            } else {
                                //如果关键字为空,则判断从 data:后面截取,然后判断是否是以FA开头
                                //如果是以FA开头,则判断第6位是否是 32 ,如果第6位是32则是我们想要的数据
                                if (line.contains("FA")) {
                                    line = line.substring(line.indexOf("data:") + 6);
                                    if (line.startsWith("FA")) {
                                        String[] chars = line.split(" ");
                                        if (chars.length >= 14) {
                                            if (chars[6].equals("32")) {
                                                logKeywordTextArea.append(frontMap.get((int) lineNum) + "\n\n");
                                                flag = true;
                                            }
                                        }
                                    }
                                }

                            }


                            //进度条显示
                            if (currentProgress >= MAX_PROGRESS) {
                                timer.cancel();
                            }
                        }
                        //System.out.println("获取值为:" + frontMap.toString());
                        //System.out.println("后三段的值为::" + afterMap.toString());
                        long end = System.currentTimeMillis();
                        long time = end - now;
                        System.out.println("花费时间:" + time);
                        System.out.println("文件共有:" + lineNum + " 行");
                        //定时器取消
                        progress_flag = true;
                        // timer.cancel();
                        //搜索完成跳出弹框提示搜索已完成
                        JOptionPane.showMessageDialog(null, "搜索完成...");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值