作为此question
的后续内容如果想要在不使用显式数据结构的情况下反向打印文件中的行,我有一个实现问题。提出了递归,这就是我所拥有的:
import java.io.*;
public class ReverseLines {
public ReverseLines() {
}
public void reverse(File fileToReverse, int n) {
try {
FileReader fr = new FileReader(fileToReverse);
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
if (n > 0) {
reverse(fileToReverse, n - 1);
}
System.out.println(line);
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] argv) {
ReverseLines testReverse = new ReverseLines();
File test = new File("money.txt");
testReverse.reverse(test, 3);
}
}
此代码打印money.txt的第一行3次,而不是前三行反向打印。坦率地(和天真地)我不知道如果只是readLine(),递归应该如何工作;使用。
感谢帮助...
由于
答案 0 :(得分:4)
你应该使用相同的BufferedReader实例,而不是在每次递归运行时创建一个新实例。
还要注意System.out.println()
应该在if条件内(否则你打印n + 1个第一行)
看起来应该是这样的:
public class ReverseLines {
public void reverse(BufferedReader br, int n) {
try {
String line = br.readLine();
if (n > 0) {
reverse(br, n - 1);
System.out.println(line);
}
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] argv) throws FileNotFoundException {
ReverseLines testReverse = new ReverseLines();
File test = new File("money.txt");
testReverse.reverse(new BufferedReader(new FileReader(test)), 3);
}
}
答案 1 :(得分:3)
您总是在阅读文件的第一行。改变它:
import java.io.*;
public class ReverseLines {
public ReverseLines() {
}
public void reverse(BufferedReader br, int n) {
try {
String line = br.readLine();
if (n > 0) {
reverse(br, n - 1);
System.out.println(line);
}
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] argv) {
ReverseLines testReverse = new ReverseLines();
File test = new File("money.txt");
FileReader fr = new FileReader(test );
BufferedReader br = new BufferedReader(fr);
testReverse.reverse(br, 3);
}
}
答案 2 :(得分:1)
每次调用该函数时,您都在重新初始化缓冲的阅读器,这使得它在每次打印之前都会搜索到文件的开头。 试试这种方式:
import java.io.*;
public class ReverseLines
{
private static BufferedReader br;
public ReverseLines()
{
}
public void reverse(File fileToReverse, int n) {
try {
String line = br.readLine();
if (n > 0) {
reverse(fileToReverse, n - 1);
}
System.out.println(line);
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] argv) {
ReverseLines testReverse = new ReverseLines();
File test = new File("money.txt");
FileReader fr = new FileReader(fileToReverse);
br = new BufferedReader(fr);
testReverse.reverse(test, 3);
}
}