Java在文本中搜索并返回文本周围的多行

Java在文本中搜索并返回文本周围的多行,java,arrays,string,java.util.scanner,Java,Arrays,String,Java.util.scanner,我正在一个更大的txt文件(~8Mb)中搜索,其中每一行都是这样的: dd/mm/yyyy hh:mm:ss之后是不同的标识符,之后是一个值 dd/mm/yyyy hh:mm:ss identifier not relevant in search dd/mm/yyyy hh:mm:ss identifier not relevant in search dd/mm/yyyy hh:mm:ss identifier not relevant in search dd/mm/yyyy hh

我正在一个更大的txt文件(~8Mb)中搜索,其中每一行都是这样的: dd/mm/yyyy hh:mm:ss之后是不同的标识符,之后是一个值

dd/mm/yyyy  hh:mm:ss identifier not relevant in search
dd/mm/yyyy  hh:mm:ss identifier not relevant in search
dd/mm/yyyy  hh:mm:ss identifier not relevant in search
dd/mm/yyyy  hh:mm:ss identifier value -> value that I am searching for
dd/mm/yyyy  hh:mm:ss identifier not relevant in search
dd/mm/yyyy  hh:mm:ss identifier not relevant in search
我已成功找到并打印出包含我正在搜索的值的整行,但我需要在其他行中打印它周围的值(后面9行,前面5行)

    public void fajl(String fajlnev, String szeriaszam) throws FileNotFoundException{
    int sorszam = 0;
    Scanner serialnummer = new Scanner(new File(fajlnev));
    while(serialnummer.hasNext()){ //keresés pörgetése
        String line = serialnummer.nextLine().toString();
        sorszam++;
        if(line.contains(szeriaszam)){
            System.out.println(line + "\n" + sorszam);
搜索和打印结果如下所示。如你所见,我也能说出行号,但我不知道如何打印出其他行。我正在考虑上载一个数组或类似的东西,但不知道从哪里开始。

您可以使用队列(例如Java
LinkedList
)在要匹配的行周围存储前9行和后5行。然后,只需打印出链表中的所有行

public void fajl(String fajlnev, String szeriaszam) throws FileNotFoundException {
    List<String> lines = new LinkedList<>();
    Scanner serialnummer = new Scanner(new File(fajlnev));
    int counter = 5;
    boolean flag = false;

    while (serialnummer.hasNext()) {
        String line = serialnummer.nextLine().toString();
        if (lines.size() >= 9 && !flag) {
            lines.removeFirst();
        }
        lines.add(line);
        if (line.contains(szeriaszam) && !flag) {
            flag = true;
        }
        else if (flag && --counter == 0) {
            break;
        }
    }

    for (String line : lines) {
        System.out.println(line);
    }
}
public void fajl(字符串fajlnev,字符串szeriaszam)抛出FileNotFoundException{
列表行=新建LinkedList();
Scanner serialnummer=新扫描仪(新文件(fajlnev));
int计数器=5;
布尔标志=假;
while(serialnummer.hasNext()){
String line=serialnummer.nextLine().toString();
if(lines.size()>=9&&!标志){
lines.removeFirst();
}
行。添加(行);
if(行包含(szeriaszam)和&!标志){
flag=true;
}
else if(标志&--counter==0){
打破
}
}
用于(字符串行:行){
系统输出打印项次(行);
}
}
这里的逻辑是,我们开始读取所有行并将其存储到一个链表中。一旦列表大小达到9,并且如果在找到匹配的线路之前出现这种情况,我们将删除最旧的线路,为最新的输入线路腾出空间。一旦我们找到匹配的行,我们也会添加它,然后再添加5行,倒计时。在方法的末尾,我们将15行(包括匹配行)打印到控制台