#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()
ее, что также приведет к ее удалению.