【问题标题】:How to write to a file multiple times in java?如何在java中多次写入文件?
【发布时间】:2013-09-23 17:17:16
【问题描述】:

我正在开发一个程序,该程序将计算 2 到 10 000 之间的所有素数并将其写入文件。

人们对如何写入文件有不同的说法,所以我接受了一个建议并尝试了它。 起初我把我的文件创建放在一个循环中,每次程序都重新创建文件,然后我把文件创建从循环中取出,现在我得到了错误。

有人可以告诉我这是否是这样做的方式,如果不是,应该如何完成,或者我怎样才能做到这一点?

已经有一个文件也可以工作,然后从我的程序中添加/编辑/覆盖它。

public static void main(String[] arg){
    int prime = 2;

    File file = new File("out.txt");      // how should i do this part
    FileWriter fw = new FileWriter(file.getAbsoluteFile());
    BufferedWriter bw = new BufferedWriter(fw);     

    while(prime < 10000){
        boolean isPrime = true;

        for( int i = 2; i <= sqrt(prime); i++){
            if( (prime%i) == 0 ){
                isPrime = false;
                break;
            }
        }
        if(isPrime){
            bw.write(prime + " ");     // and this
        }
        prime++;
    }
}

【问题讨论】:

标签: java file overwrite


【解决方案1】:

你必须在最后写入并关闭 FileWriter 和 BufferedWriter。

将这些行放在循环之后的最后 --

bw.close();
fw.close();

此外,使用FileWriter fw = new FileWriter(file.getAbsoluteFile(), true); 可以让您追加到现有文件。请注意“真实”。

【讨论】:

    【解决方案2】:

    代码看起来不错,完成后请务必关闭流。

    如果不想每次都新建一个文件,可以用写模式打开一个已有的文件

    How do I create a file and write to it in Java?

    【讨论】:

      【解决方案3】:

      如果出现故障,我会将bw.write(prime + " "); 放入try/catch 块中以优雅地退出。如果文件没有file.exists(),您可能还想包含file.createNewFile() 语句。

      最后,确保您bw.close() 缓冲的写入器。

      除此之外,是的,一切看起来都符合标准。

      我会做一个:

      try {
        bw.write(stuff);
      }
      Catch (IOException e) {
        e.printStackTrace();
      }
      

      【讨论】:

      • 我把 try/catch 块放在我的 if 语句和 bw.close();在我的while循环之后,但它仍然无法编译。它说:“必须捕获或声明抛出未报告的异常 ioexception”在我的文件创建过程中
      【解决方案4】:

      我的猜测是您的错误是由于您的某些代码可以抛出的检查异常引起的,并且您没有捕获或声明 main 抛出。您还可能泄漏资源。如果您使用的是 Java 7,我建议如下(使用 try-with-resources statement):

      public static void main(String[] arg){
          File file = new File("out.txt");
          try (
              BufferedWriter bw = new BufferedWriter(new FileWriter(file))
          ) {
              for (int prime = 2; prime < 10000; ++prime) {
                  boolean isPrime = true;
                  final int limit = (int) sqrt(prime); // 
                  for (int i = 2; i <= limit && isPrime; i++) {
                      isPrime = prime % i != 0;
                  }
                  if (isPrime){
                      bw.write(String.valueOf(prime));
                      bw.newLine();
                  }
              }
          } catch (IOException ex) {
              e.printStackTrace();
          }
      }
      

      在 Java 7 之前,您应该这样做:

      public static void main(String[] arg){
          File file = new File("out.txt");
          BufferedWriter bw = null;
          try {
              bw = new BufferedWriter(new FileWriter(file));
      
              for (int prime = 2; prime < 10000; ++prime) {
                  boolean isPrime = true;
                  int limit = (int) sqrt(prime);
                  for( int i = 2; i <= limit && isPrime; i++) {
                      isPrime = prime % i != 0;
                  }
                  if (isPrime) {
                      bw.write(String.valueOf(prime));
                      bw.newLine();
                  }
              }
          } catch (IOException ex) {
              e.printStackTrace();
          } finally {
              if (bw != null) {
                  try { bw.close(); }
                  catch (IOException ignored) { }
              }
          }
      }
      

      顺便说一句,您测试素数的方法效率极低。您可能想看看使用Sieve of Eratosthenes

      【讨论】:

      • 谢谢!现在它可以正常工作了!我知道这种方法不是最好的,但它是一种简单的方法。但我会考虑你的建议,也许用这种方法做另一个程序!
      【解决方案5】:

      使用 StringBuffer 缓存所有素数,在 for 循环完成对所有数字的迭代后,将 StringBuffer 转换为 String 并一次性写入输出文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 1970-01-01
        相关资源
        最近更新 更多