(JAVA / JAVAFX) Попытка создать и записать в файл только создает пустой файл

#java #javafx #textfield #filewriter #bufferedwriter

#java #javafx #текстовое поле #filewriter #bufferedwriter

Вопрос:

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

В настоящее время программа создает файл с указанным именем, но ничего в него не записывает (текстовый файл пустой.) Что я делаю не так?

Код:

 try {
          File myObj = new File(mNameTF.getText() ".txt");
          if (myObj.createNewFile()) {
            System.out.println("File created: "   myObj.getName());
            FileWriter myWriter = new FileWriter(mNameTF.getText() ".txt");
            BufferedWriter bw = new BufferedWriter(myWriter);
            bw.write("Movie: "  mNameTF.getText());
            bw.newLine();
            bw.write("Actors: " actorsTF.getText());
            bw.newLine();
            bw.write("Director: "  dirTF.getText());
            bw.newLine();
            bw.write("Producer: "  prodTF.getText());
            bw.newLine();
            bw.write("Info: " descriptionTA.getText());
            primaryStage.setScene(sceneA);
            } else {
              System.out.println("File already exists.");
              
            }
          } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
          }
 

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

1. Попробуйте bw. flush(); после последней bw.write. Также закройте поток.

2. это в основном не связано с javafx — это обычный java io 🙂 Разделяй и властвуй — проверенная стратегия решения проблем: поэтому в следующий раз (обязательно будет следующая проблема, она всегда есть у всех нас, какими бы новыми или опытными мы ни были 🙂 разбейте его на более мелкие части: например, если запись в файл не работает,просто попробуйте написать какой-нибудь жестко запрограммированный текст (без пользовательского интерфейса) — вам поможет множество руководств

Ответ №1:

Вы должны использовать «попробовать с ресурсами».

 try{
    File myObj = new File(mNameTF.getText() ".txt");
    if (myObj.createNewFile()) {
        System.out.println("File created: "   myObj.getName());
        try( FileWriter myWriter = new FileWriter(mNameTF.getText() ".txt");
             BufferedWriter bw = new BufferedWriter(myWriter) ){
            bw.write("Movie: "  mNameTF.getText());
            bw.newLine();
            bw.write("Actors: " actorsTF.getText());
            bw.newLine();
            bw.write("Director: "  dirTF.getText());
            bw.newLine();
            bw.write("Producer: "  prodTF.getText());
            bw.newLine();
            bw.write("Info: " descriptionTA.getText());
            primaryStage.setScene(sceneA);
        }
    } else {
        System.out.println("File already exists.");          
    }
} catch (IOException e){
    System.out.println("An error occurred.");
    e.printStackTrace();
}
 

Таким образом, буферизованное средство записи будет автоматически закрыто в конце внутреннего блока try.

Более новым способом справиться с этим было бы использовать Files класс.

 try( 
   BufferedWriter bw = Files.newBufferedWriter​(
       Paths.get(mNameTF.getText() ".txt"), 
       StandardOpenOption.CREATE_NEW
   ) 
){
   //just the write code.
} catch(FileAlreadyExistsException exists){
   //this is where you'll handle already exists exception.
} catch(IOException ioe){
   //handle ioexception here.
   //if you don't want to handle it (which you aren't).
   throw new RuntimeException(ioe);
}
 

Ответ №2:

BufferedWriter записывает текст большими «пакетами», чтобы уменьшить количество вызовов ОС. Это означает, что текст не появится сразу в файле. Если вы хотите заставить его записать текст, который он хранит для будущей записи, вы должны вызвать его flush() метод.

Вы также не закрыли программу записи, которая 1. сохраняет файл открытым и недоступным для редактирования 2. использует ненужную память. Вы можете закрыть программу записи, вызвав close() ее, что также приведет к ее удалению.