说明:
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();