【问题标题】:Buffered Writer overwriting file when not wantedBufferedwriter 在不需要时覆盖文件
【发布时间】:2013-08-08 11:55:58
【问题描述】:

我这里有这段代码,它接受 3 个参数,一个目录、一个文件名和一个数字。程序在目录中创建文件名并将数字写入其中。所以我可以说...

>java D: myName.txt Clay 100

这将在 D: 中创建一个名为 myName.txt 的文件,并在其中显示 100。

如果 myName 被占用,它将名称更改为 myName(2),然后是 myName(3)(如果 myName(2) 被占用)。唯一的问题是,当它将名称更改为 myName(2) 并写入时,它会覆盖 myName。我不希望它覆盖 myName,我希望它只创建一个具有该名称的新文件。我看过类似的问题,常见的答案是冲洗并关闭我做过的作家,但它仍然不起作用。

任何帮助将不胜感激,这是我的代码...

import java.io.*;

public class filetasktest{
  public static void main(String[] args) throws IOException{
  int i = 2;
  String directory = args[0];
  if (directory.substring(directory.length() - 1) != "/"){
    directory += "/";
  }
  String contactName = args[1];
  String contactNumber = args[2];

  String finalDirectory = directory + contactName + ".contact";

  File f = new File(finalDirectory);

  while (f.exists()){
    finalDirectory = directory + contactName + "(" + ("" + i) + ")" + ".contact";
    f.renameTo(new File(finalDirectory));
    i++;
  }

  Writer writer = null;
  try {
    writer = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(finalDirectory), "utf-8"));
    writer.write(contactNumber);
  } catch (IOException ex){
    System.out.println(ex.getMessage());
  } finally {
    try {
      writer.close();
    } catch (Exception ex) {
      System.out.println(ex.getMessage());
    }
  }
}

}

【问题讨论】:

    标签: java file overwrite


    【解决方案1】:

    你需要使用追加模式

     new BufferedWriter(new FileWriter(yourFileName, true));
    

    这里,true 表示 txt 应该附加在文件末尾。 查看FileWriter javadoc 了解更多信息。

    【讨论】:

    • 在我的代码中,我应该把真实的放在哪里?因为我把它放在 writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(finalDirectory), "utf-8")) 中的“finalDirectory”之后它不起作用。
    • 我认为这个问题是关于如何创建新文件,而不是关于如何将数据附加到现有文件......
    • 是的,我不想将它附加到现有文件中,我希望 myName(2) 成为一个完整的其他文件。
    【解决方案2】:

    你的问题在这里:

    while (f.exists()){
      finalDirectory = directory + contactName + "(" + ("" + i) + ")" + ".contact";
      f.renameTo(new File(finalDirectory));
      i++;
    }
    

    renameTo 方法不会改变 File 对象的路径;它重命名磁盘上的文件。 f 的路径在整个循环中保持不变:它以 D:/myName.txt 开始,如果存在同名的文件,则将文件重命名为 D:/myName(1).txt。变量f仍然持有路径D:/myName.txt,不再命名文件,内容写入D:/myName(1).txt,覆盖之前的内容。

    要解决此问题,请将循环更改为:

    while (new File(finalDirectory).exists()){
      finalDirectory = directory + contactName + "(" + ("" + i) + ")" + ".contact";
      i++;
    }
    

    【讨论】:

      【解决方案3】:

      查看FileInputStream(String, boolean),它可以让您标记是否应该附加或覆盖文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        相关资源
        最近更新 更多