Buffered Writer перезаписывает файл, когда он не нужен

У меня есть этот код, который принимает 3 аргумента: каталог, имя файла и число. Программа создает имя файла в каталоге и записывает в него номер. Так что могу сказать...

>java D: myName.txt Clay 100

который создаст файл с именем myName.txt в D: и в нем будет указано 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());
    }
  }
}

}


person Ogen    schedule 07.08.2013    source источник


Ответы (3)


Ваша проблема здесь:

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++;
}
person Joni    schedule 07.08.2013

Вам нужно использовать режим добавления

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

здесь true означает, что текст должен быть добавлен в конец файла. Проверьте FileWriter javadoc для получения дополнительной информации.

person Prasad Kharkar    schedule 07.08.2013
comment
Где в моем коде я помещаю истину? Потому что я поместил его после finalDirectory в Writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(finalDirectory), utf-8)); и это не работает. - person Ogen; 07.08.2013
comment
Я думаю, что этот вопрос о том, как создавать новые файлы, а не о том, как добавлять данные в существующий файл... - person Joni; 07.08.2013
comment
Да, я не хочу добавлять его к существующему файлу, я хочу, чтобы myName(2) был совершенно другим файлом. - person Ogen; 07.08.2013

Взгляните на FileInputStream(String, boolean), который позволит вам указать, следует ли добавить файл или перезаписать его.

person MadProgrammer    schedule 07.08.2013