Ich habe eine frühere Frage gestellt, in der gefragt wurde, wie in eine CSV-Datei geschrieben werden soll, und ich habe viel Unterstützung erhalten, aber leider überschreibt der Code jedes Mal, wenn er ausgeführt wird, die alten Daten, aber ich muss die Daten der Datei ergänzen, um sie nicht zu überschreiben.

Die Anwendung ist eine einfache Anmeldeseite, auf der der vom Benutzer eingegebene Benutzername und das Kennwort in einer CSV-Datei gespeichert werden.

 public void setCreateButton() throws Exception {

    String newUsername = usernameTextField.getText();
    String newUserPassword = passwordField.getText();
    String confirmedPassword = confirmPasswordField.getText();

    try {
        if (newUserPassword.equals(confirmedPassword)) {
            File file = new File("D:\\Users\\login.csv");
            PrintWriter printWriter = new PrintWriter(file);
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(newUsername);
            stringBuilder.append(',');
            stringBuilder.append(newUserPassword);
            stringBuilder.append('\n');
            printWriter.write(stringBuilder.toString());
            printWriter.flush();
            printWriter.close();
        } else {
            System.out.println("Password are not matched");
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

Jedes Mal, wenn auf die Schaltfläche geklickt wird, werden die Daten in der CSV-Datei überschrieben. Ich brauche nur etwas, um eine in der Datei vorhandene Zeile zu überspringen und eine neue Zeile mit den neuen Daten hinzuzufügen.

0
Ressay 7 Feb. 2020 im 18:06

3 Antworten

Beste Antwort

Wenn Sie sich nicht mit allen Arten von Schriftstellern und Druckern befassen möchten (diese Namen sind zumindest für mich verwirrend), können Sie die Funktion Files.write() verwenden. Es übernimmt das Öffnen und Schließen von Dateien für Sie und befindet sich in der Java-Kernbibliothek.

Ihr Code könnte sein

 try {
        if (newUserPassword.equals(confirmedPassword)) {
            Path filePath = Paths.get("./file.csv");
            if (Files.notExists(filePath)) {
                filePath.toFile().createNewFile();
            }

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(newUsername);
            stringBuilder.append(',');
            stringBuilder.append(newUserPassword);
            stringBuilder.append(System.lineSeparator());

            Files.write(filePath, stringBuilder.toString().getBytes(), StandardOpenOption.APPEND);
        } else {
            System.out.println("Password are not matched");
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
2
HarryQ 7 Feb. 2020 im 18:35

Der einfachste Weg, um das gewünschte Verhalten zu erreichen, ist die Verwendung von FileWriter. Es hat einen Konstruktor, der verwendet ein boolean Argument. Sie sollten true an dieses Argument übergeben, damit Ihre angehängte Datei nicht überschrieben wird. Sowas in der Art:

FileWriter fr = new FileWriter(file, true);
PrintWriter printWriter = new PrintWriter(fr);
3
Vladimir Pligin 7 Feb. 2020 im 15:17

Verwenden Sie den APPEND-Modus von BufferedWriter. Verwenden Sie besser die vollständige Unicode-Unterstützung, dh speichern Sie die Protokolldatei in UTF-8. Insbesondere für Passwörter, die Sie nicht von lokal nicht konvertierbaren Unicode-Symbolen sehen möchten.

FileWriter sollte nicht verwendet werden, obwohl es angehängt werden kann, da es in der Standardplattformcodierung schreibt.

public void setCreateButton() throws Exception {
    String newUsername = usernameTextField.getText();
    String newUserPassword = passwordField.getText();
    String confirmedPassword = confirmPasswordField.getText();
    try {
        if (newUserPassword.equals(confirmedPassword)) {
            Path file = Paths.get("D:\\Users\\login-utf8.csv");
            try (PrintWriter printWriter =
                   new PrintWriter(Files.newBufferedWriter(file, StandardCharsets.UTF_8,
                       StandardOpenOptions.CREATE, StandardOpenOptions.APPEND)) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append(newUsername);
                stringBuilder.append(',');
                stringBuilder.append(newUserPassword);
                stringBuilder.append('\n');
                printWriter.write(stringBuilder.toString());
            }
        } else {
            System.out.println("Password are not matched");
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}
0
Joop Eggen 7 Feb. 2020 im 17:09