反复写入文件

时间:2014-11-20 19:36:32

标签: java file writing

我是一个经验丰富的C ++人,正在慢慢学习Java。我正在编写一个需要执行以下操作的程序:

  • 创建一个简单的文本文件,默认目录没问题
  • 程序运行时,定期将一行数据写入文件。根据许多因素,程序可能会对文件写入一次或一百万次。没有办法知道哪个写将是最后一个。

我一直在研究不同的方法,这是我提出的工作代码。有两个文件,“PeteProgram.java”和“PeteFileMgr.java”:

/*
"PeteProgram.java"
*/

import java.io.*;
import java.lang.String;

public class PeteProgram {

    public static void main(String[] args) throws IOException {

      String PeteFilename="MyRecordsFile.txt";
      Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(PeteFilename), "utf-8"));
      PeteFileMgr MyPeteFileMgr = new PeteFileMgr(writer);

      MyPeteFileMgr.AddThisString(writer, "Add this line #1\n");
      MyPeteFileMgr.AddThisString(writer, "Add this line #2\n");
      MyPeteFileMgr.AddThisString(writer, "Add this line #3\n");

    }
}


//=====================================================================================================
//=====================================================================================================


/*
"PeteFileMgr.java"
*/

import java.io.*;

public class PeteFileMgr {

  public PeteFileMgr(Writer writer) {

       try {
          writer.write("File created!");

             } catch (IOException ex) {
          // report
          } finally {
             try {writer.close();} catch (Exception ex) {}
          }
      }

  void AddThisString(Writer writer, String AddThis) {

    try {
          writer.append(AddThis);

             } catch (IOException ex) {
          // report
          } finally {
             try {writer.close();} catch (Exception ex) {}
          }
      } 
  }   

文件的初始创建工作正常。但是,要添加的行不会写入文件。因为程序编译并运行没有错误,我假设程序试图写入添加的行,失败,并抛出异常。 (不幸的是,我正在使用原始编译器/调试器,但无法查看是否是这种情况。)

有没有人发现我的错误?

       Many thanks!
            -P

1 个答案:

答案 0 :(得分:3)

那是因为你没有冲洗Writer。您应该不时致电flush。此外,您应该在应用程序结束时close Writer ,而不是在将内容写入其中之后。 close方法自动刷新writer的内容。

所以,这就是你的代码应该是这样的:

public class PeteProgram {
    public static void main(String[] args) {
        String peteFilename = "MyRecordsFile.txt";
        //here's when the physical file is created
        Writer writer = null;
        try {
            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(peteFilename), "utf-8"));
        PeteFileMgr peteFileMgr = new PeteFileMgr(writer);

        peteFileMgr.addThisString(writer, "Add this line #1\n");
        peteFileMgr.addThisString(writer, "Add this line #2\n");
        peteFileMgr.addThisString(writer, "Add this line #3\n");
        } catch (IOException e) {
            //handle the exception
            //basic handling
            e.printStacktrace();
        } finally {
            //this is a must!
            try { writer.close(); } catch(IOException silent) { }
        }
    }
}

public class PeteFileMgr {
    public PeteFileMgr(Writer writer) {
        try {
            //this method is not creating the physical file
            writer.write("File created!");
        } catch (IOException ex) {
          // report
        } finally {
            //remove this call to close
            //try {writer.close();} catch (Exception ex) {}
        }
    }

    public void addThisString(Writer writer, String addThis) {
        try {
            writer.append(addThis);
        } catch (IOException ex) {
            // report
        } finally {
            //remove this call to close
            //try {writer.close();} catch (Exception ex) {}
        }
    }
}

或者如果使用{7}}

使用Java 7或更高版本
public class PeteProgram {
    public static void main(String[] args) {
        String peteFilename = "MyRecordsFile.txt";
        //here's when the physical file is created
        try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(peteFilename), "utf-8"))) {
        PeteFileMgr peteFileMgr = new PeteFileMgr(writer);

        peteFileMgr.addThisString(writer, "Add this line #1\n");
        peteFileMgr.addThisString(writer, "Add this line #2\n");
        peteFileMgr.addThisString(writer, "Add this line #3\n");
        } catch (IOException e) {
            //handle the exception
            //basic handling
            e.printStacktrace();
        }
    }
}