如何一次只读取n行并以反向Java打印

时间:2018-09-24 21:09:20

标签: java collections stack bufferedreader

我的目标是一次只从一个文本文件中读取50行,以相反的顺序打印它们,一次只在内存中存储50行。以最有效的方式。

这是我想出的代码,但是输出不符合预期。我已经用104行的输入文件对其进行了测试。

实际输出:打印第50行到第1行,第101行到第52行(跳过第51行),第104到103行(跳过第102行)。

预期输出:第50行-第1行,第101行-第51行,第104-102行。

我也不知道如何更改第一个while循环,因此它一直持续到文件结尾,因为测试while(r.readLine!= null)也不起作用。

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    Stack<String> s = new Stack<String>();
    int i = 0;
    int x = 0;


    while (x < 5) {
        for (String line = r.readLine(); line != null && i < 50; line = r.readLine()) {
            s.push(line);
            i++;
        }

        i = 0;

        while (!s.isEmpty()) {
            w.println(s.pop());

        }

        x++;

    }



}

3 个答案:

答案 0 :(得分:0)

自您放入

以来看起来像
line = r.readLine()

在迭代中,在检查之前读取一行

line != null && i < 50

这将导致读取一行,而不是对i进行i <50的检查,并且由于i的确小于50,因此该行不会被压入堆栈,一旦退出该行,我们便会忘记它for块。

尝试在for块内添加红线。如果需要,您仍然可以在for块中保留line!= null的条件。

干杯!

答案 1 :(得分:0)

确定第一件事

for (String line = r.readLine(); line != null && i < 50; line = r.readLine()) 

此for循环读取的另一时间达到50。这是额外行的主要原因。

  

我也不知道如何更改第一个while循环,所以它会继续   直到文件末尾

这是因为您的操作不正确。我进行了模拟以打印所需的行为:

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    Stack<String> s = new Stack<String>();
    int i = 0;
    int x = 0;
    String strLine;
    while ((strLine = r.readLine()) != null){ // Read until end of File
        s.push(strLine); // add to the Stack
        i++;
        if(i==50) // Print if is equal to 50
        {
            while (!s.isEmpty()) {
                System.out.println(s.pop());
            }
            i=0;
        }
    }

    while (!s.isEmpty()) {
        System.out.println(s.pop()); // Print the last numbers
    }
}

答案 2 :(得分:0)

您可以使用lines()BufferedReader创建流,然后仅占用50个元素。 像

List<String> lines = r.lines().limit(50).collect(toList());

然后可以从列表行和打印行进行迭代;

for(int i = lines.size()-1; i >= 0; --i) {
   System.out.println(lines.get(i));
}