【问题标题】:Why is my BufferedReader not reading my file correctly?为什么我的 BufferedReader 不能正确读取我的文件?
【发布时间】:2014-05-19 07:48:36
【问题描述】:

我有一个小程序,它从 .txt 文件中读取一个数字,将其递增,并在每次运行时将其打印回文件:

public class ClientCounter {

    int count = 0;
    String input = "";

    public int addClient() {

        try (
            PrintWriter out = new PrintWriter(new FileWriter("test.txt"));
            BufferedReader in = new BufferedReader(new FileReader("test.txt"));
        ) {
            input = in.readLine();

            System.out.println("Input line is " + input);

            if (input != null)
                count = Integer.parseInt(input);

            System.out.println("Client count is: " + count);
            count++;

            System.out.println("After increment, count is: " + count);

            String output = Integer.toString(count);
            System.out.println("Output is " + output);

            out.println(output);

        } catch(FileNotFoundException e) {
            System.out.println("FNFE!");
            System.exit(1);
        } catch(IOException e) {
            System.out.println("IOE!");
            System.exit(1);
        }

        return count;

    }

但是,每次我尝试运行它时,都会得到以下输出:

Input line is null
Client count is: 0
After increment, count is: 1
Output is 1

我的test.txt 文件始终只包含一个数字1

知道为什么会这样吗?

【问题讨论】:

  • 我认为是因为您阅读了正在编写的文件。 PrintWriter out = new PrintWriter(new FileWriter("test.txt")); 新建一个空文件。
  • 文件可能没有准备好。当你试图阅读它时。试图关闭作家
  • 尝试使用RandomAccessFile,并以读/写模式打开它?
  • 我在你的程序中看到的错误是你不能同时打开同一个文件进行读写,这是串行操作,你必须关闭一个来做另一个。

标签: java bufferedreader bufferedwriter


【解决方案1】:

每次重写新文件时。

尝试如下,第二个参数(true)表示使用现有文件。

 PrintWriter out = new PrintWriter(new FileWriter("test.txt",true));

上面的答案是错误的……下面更新了答案……

编辑的代码:可能user270349是正确的。下面的代码对我有用。

公共类 ClientCounter {

static int count = 0;
static String input = "";

public static void main(String args[]){
    addClient();
}

public static int addClient() {

    try {
        BufferedReader in = new BufferedReader(new FileReader("test.txt"));
        input = in.readLine();
        if (input != null)
            count = Integer.parseInt(input);
        System.out.println("Client count is: " + count);
        count++;
        in.close();

        System.out.println("After increment, count is: " + count);

        PrintWriter out = new PrintWriter(new FileWriter("test.txt"));
        String output = Integer.toString(count);
        System.out.println("Output is " + output);

        out.println(output);
        out.flush();out.close();

    } catch(FileNotFoundException e) {
        System.out.println("FNFE!");
        System.exit(1);
    } catch(IOException e) {
        System.out.println("IOE!");
        System.exit(1);
    }

    return count;
}
}

【讨论】:

  • after-edit:你应该使用 try-finally 或 try-with-resources 来关闭资源。使用您的代码,如果出现意外失败,文件可能会保持打开状态。例如,如果该行不包含整数,count = Integer.parseInt(input); 可能会失败。
【解决方案2】:

您必须在处理完文件后立即关闭它们。将同一个文件打开两次也是一个坏主意。 也许你应该这样做:

BufferedReader in = ...
try {
  count = Integer.parseInt(in.readLine());
} finally {
  in.close();
}
count++;
  PrintWritter out = ...
try {
  out.println(count);
} finally {
  out.close();
}

【讨论】:

    【解决方案3】:

    您没有关闭文件。当程序结束并且缓冲区尚未写入磁盘时,您的修改将丢失。

    【讨论】:

    • 这可能不准确。文件在 JVM 退出时关闭。
    • 我见过很多初学者都遇到过这种情况。使用后关闭资源,否则您将获得不可预测的(尽管在这种情况下是可预测的)结果。
    【解决方案4】:

    用于从文件中读取内容...

    File f = new File("test.txt"); 
    

    FileReader fr = new FileReader(f);

    BufferedReader br = new BufferedReader(fr);

    字符串 str = null;

    while ((str = br.readLine())!=null) {

    // 行存储在 'String s' 中。用 str 做任何你想做的事

    }

    br.close(); //不要忘记调用close方法关闭BufferedReader的实例。

    用于在文件中写入内容...

    File f = new File("newfile.txt");
    String content = "This is something I want to write";
    BufferedWriter bw = new BufferedWriter(f);
    bw.write(content);
    bw.close();
    

    【讨论】:

    • 你应该使用 try-finally 或 try-with-resources 来关闭资源。
    【解决方案5】:
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class BufferedReaderTest {
    
    
        public static void main(String args[]) {
             int count = 0;
             String input;
    
            try {
                BufferedReader br = new BufferedReader(new FileReader("E:\\this.txt"));
                PrintWriter pw = new PrintWriter(new FileWriter("E:\\this.txt"));
                input = br.readLine();
                if (input != null)
                    count = Integer.parseInt(input);
                System.out.println("Client count is: " + count);
    
                System.out.println("After increment, count is: " + (++count));
    
                String output = Integer.toString(count);
                System.out.println("Output is " + output);
    
                pw.println(output);
                pw.flush();
                pw.close();
    
            } catch (FileNotFoundException e) {
                System.out.println("FNFE!");
                System.exit(1);
            } catch (IOException e) {
                System.out.println("IOE!");
                System.exit(1);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多