从文本文件中读取行的范围

时间:2014-11-07 09:15:41

标签: java android file bufferedreader

我有一个非常大的文本文件,如下所示:

0  239.0 -13.0 0
1  240.0 -13.0 33
2  241.0 -13.0 34
3  242.0 -13.0 44
4  243.0 -13.0 45
5  244.0 -13.0 74
6  245.0 -13.0 74
7  246.0 -13.0 79
8  247.0 -13.0 79
9  248.0 -13.0 113
10  249.0 -13.0 113
11  250.0 -13.0 120
12  251.0 -13.0 120
13  252.0 -13.0 153
14  253.0 -13.0 153
15  254.0 -13.0 160
16  255.0 -13.0 160
17  256.0 -13.0 194
18  257.0 -13.0 195
19  258.0 -13.0 199
20  259.0 -13.0 200
21  260.0 -13.0 232
22  261.0 -13.0 232
23  262.0 -13.0 239
...
...

每行的最后一个条目是timestamp。 现在我想实现一个名为read(int timestamp, int range)的方法,它以有效的方式从这个文本文件中返回一系列行。 例如,如果我调用read(10250,100),我想寻找时间戳为10250的行(如果存在这样的行,否则最接近下一行)并返回100行之前时间戳行,该行使用timstamp本身,并在字符串数组中的时间行后100行。

以下是我read(int timestamp, int range)的当前实现:

public static void read(int timestamp,int range) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("LOG_TEST"));
    String line;
    int currTimestamp;
    while ((line = br.readLine()) != null) {
        currTimestamp = Integer.parseInt(line.split("\\s+")[3]);
        if (currTimestamp >= timestamp) {
            for(int i = 0; i<range;i++){
                System.out.println(br.readLine());
            }
            break;
        }
    }
    br.close();
}

问题是此实现仅在时间戳后打印出100行。我以前不知道如何包含100行。因为我不知道时间戳行在哪一行,我需要以某种方式阅读&#34; 向后&#34;以前获得100行。 如何以有效的方式实现这一点? 亲切的问候

2 个答案:

答案 0 :(得分:1)

我会使用固定大小range的{​​{3}},例如100.引用其添加方法:

  

将给定元素添加到此队列。如果队列已满,则最近添加的元素将被丢弃,以便可以插入新元素。

这样,你只保留在内存range行,而不是所有以前的行。

您可以从CircularFifoQueue下载jar。

它还提供了一个get(int index)方法,您可以使用它按照您希望的顺序打印行,但我认为您不需要它,因为迭代器按插入顺序返回元素。所以,这是我的建议:

public static void read(int timestamp,int range) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("LOG_TEST"));
    String line;
    CircularFifoQueue<String> prevLines = new CircularFifoQueue<>(range);
    int currTimestamp;
    while ((line = br.readLine()) != null) {            
        currTimestamp = Integer.parseInt(line.split("\\s+")[3]);
        if (currTimestamp >= timestamp) {
            for (String prevLine : prevLines) {  //prints the range previous lines
                System.out.println(prevLine);
            }
            System.out.println(line);            //prints the current line
            for(int i = 0; i<range;i++){         //prints the following range lines
                System.out.println(br.readLine());
            }                
            break;
        } else {
            prevLines.add(line);
        }
    }
    br.close();
}

答案 1 :(得分:0)

尝试:

public static void read(int timeStamp,int range) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("LOG_TEST"));
    String line;
    ArrayList<String> save=new ArrayList<String>();
    int currTimestamp;
    String str:
    while ((line = br.readLine()) != null) {
        timestamp = Integer.parseInt(line.split("\\s+")[3]);
        save.add(br.readLine());
        int i=save.length-100;
        if (currTimestamp >= timestamp) {
            //logic for print 100 line from array save
            ...

            for(int i = 0; i<range;i++){
                System.out.println(br.readLine());
            }
            break;
        }
    }
    br.close();
}