不需要时缓冲的Writer覆盖文件

时间:2013-08-07 07:57:08

标签: java file overwrite

我这里有这个代码,它包含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());
    }
  }
}

}

3 个答案:

答案 0 :(得分:2)

您需要使用追加模式

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

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

答案 1 :(得分: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++;
}

答案 2 :(得分:1)

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