为什么这个递归Java程序没有正确地反转文本文件中的行

时间:2011-07-02 19:38:15

标签: java recursion

作为此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(),递归应该如何工作;使用。

感谢帮助...

由于

3 个答案:

答案 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);
   }
}