我的目标是一次只从一个文本文件中读取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++;
}
}
答案 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));
}