Как я могу открыть файл на java без удаления его содержимого?

#java #file #io #java-io #formatter

Вопрос:

Я хочу, чтобы моя программа создала файл для пользователя (только в первый раз) и записала в него некоторую информацию (это не просто строка, и ее также можно настроить в любое время позже). Поэтому я сделал это:

 public void write() {
    try {
        file = new File("c:\Users\Me\Desktop\text.txt");
        
        if(!file.exists())            // I found this somewhere on the internet for File class
            file.createNewFile();     // not to remove contents. I have no idea if it works
        
        writer = new Formatter(file);
    
    } catch(Exception e) {
        e.printStackTrace();
    }

    writer.format("%s  %s ", nameInput.getText(),lastNameInput.getText());
    
    writer.close();
}
 

Это работает, но есть некоторые проблемы:

  1. Когда файл открывается позже, по умолчанию класс File удаляет его содержимое.
  2. Когда информация записывается в файл и форматер закрывается, в следующий раз где-нибудь в другом месте программы, когда я снова использую его для записи в файл, информация обновляется и не добавляется к предыдущим. И если я его не закрою, он не будет писать.

Комментарии:

1. Вместо того, чтобы переходить file непосредственно в Formatter конструктор, вы можете сначала обернуть его туда new FileWriter(f,true) , где true включен режим добавления, и передать эту запись. Но помимо этого, есть ли какая-то конкретная причина, по которой вы используете Formatter вместо более распространенного PrintStream или PrintWriter (оба предоставляют format("format", data...) метод)?

2. @Pshemo да,я использую форматирование, потому что я хочу, чтобы информация была в том формате, в котором я хочу, чтобы она была, тогда я смогу прочитать их с помощью класса сканера. Я знаю, что есть много других занятий, которые лучше использовать здесь, но я использую их как часть практики. Я немного новичок в концепциях ввода-вывода, и считалось, что я использую их для простого письма и чтения.

3. found this somewhere on the internet есть одно место, где вы должны найти определение того, как должна работать среда выполнения Java. Начиная с 2021/06 года сделайте это 16-м изданием документации Java Standard Edition , например, для nio .

Ответ №1:

прежде всего, этот код здесь:

 if(!file.exists())            
        file.createNewFile();
 

он создает новый файл только в том случае, если он не существует в вашем пути.

Чтобы записать свой файл без перезаписи, я рекомендую вам сделать это:

 FileWriter fileWriter;
public void write() {
try {
    file = new File("c:\Users\Me\Desktop\text.txt");

    if(!file.exists())            
        file.createNewFile();

    // use a FileWriter to take the file to write on 
    fileWriter = new FileWriter(file, true); // true means that you do not overwrite the file
    writer = new Formatter(fileWriter); // than you put your FileWriter in the Formatter

} catch(Exception e) {
    e.printStackTrace();
}

writer.format("%s  %s ", nameInput.getText(),lastNameInput.getText());

writer.close();
}
 

Надеюсь, это было полезно! 🙂

Комментарии:

1. true means that you overwrite the file на самом деле все наоборот… Ничего не будет перезаписано, вместо этого будет добавлено новое содержимое. Кроме того FileWriter fileWriter; , это, вероятно, должно быть не поле, а локальная переменная.

2. @Pshemo благодаря вам обоим моя проблема решена.

Ответ №2:

Как уже упоминалось выше, мне пришлось передать файл через конструктор класса FileWriter. таким образом, моя первая проблема была решена (я упомянул о них в вопросе), а для второй мне приходилось заново открывать форматер всякий раз, когда я хотел добавить больше.

 public void write() {

  try { 
    
    writer = new Formatter(new FileWriter(file,true);

} catch(Exception e) {
    e.printStackTrace();
}

writer.format("%s  %s ", nameInput.getText(),lastNameInput.getText());

writer.close();  }
 

создание и инициализация файла должны быть выполнены один раз и вне метода.

Комментарии:

1. Если вы ознакомились с документацией, вы должны были заметить форматирование пустоты. флеш() .

2. (Первоначальная редакция этого ответа не указывает точно, что в представленном коде имеет значение в отношении «Класса файла, не удаляющего содержимое». ( java.io.File поскольку путь с неправильным именем, неудивительно, что он никоим образом не влияет на содержимое файла .))