【问题标题】:Repeatedly Writing to a File重复写入文件
【发布时间】:2014-11-20 19:36:31
【问题描述】:

我是一个中等经验的 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

【问题讨论】:

    标签: java file writing


    【解决方案1】:

    那是因为您没有刷新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) {}
            }
        }
    }
    

    或者,如果使用 Java 7 或更高版本,则使用 try-with-resources

    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();
            }
        }
    }
    

    【讨论】:

    • writer.close() 的调用仍应位于main 中的finally 块中。
    • 太棒了!这工作得很好......!非常感谢:)
    猜你喜欢
    • 2013-04-17
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2019-11-30
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多