PrintWriter 向 txt 写入了一些奇怪的东西

PrintWriter writes something strange to txt

我希望这个程序在 .txt 文件中写入 UTF-8 字母,但结果我有数字和其他无意义的字符。谁能帮我解决它?我不知道如何在打印作家中制作它。我将不胜感激任何帮助。这是我的代码。

//all imports

public class Main extends Application {

    Stage okno;
    TableView<Produkt> tabela;
    TextField nazwaWejscie, iloscWejscie;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        okno = primaryStage;
        okno.setTitle("Stwórz listę zakupów");

        // Kolumna nazwa
        TableColumn<Produkt, String> kolumnaNazwa = new TableColumn<>("Nazwa");
        kolumnaNazwa.setMinWidth(200);
        kolumnaNazwa.setCellValueFactory(new PropertyValueFactory<>("nazwa"));

        // Kolumna ilosc
        TableColumn<Produkt, Double> kolumnaIlosc = new TableColumn<>("Ilość");
        kolumnaIlosc.setMinWidth(100);
        kolumnaIlosc.setCellValueFactory(new PropertyValueFactory<>("ilosc"));

        // Wprowadź nazwę
        nazwaWejscie = new TextField();
        nazwaWejscie.setPromptText("Nazwa (string)");
        nazwaWejscie.setMinWidth(100);

        // Wprowadź ilość
        iloscWejscie = new TextField();
        iloscWejscie.setPromptText("Ilość (double)");

        // Przyciski
        Button dodaj = new Button("Dodaj");
        dodaj.setOnAction(e -> kliknijDodaj());
        Button usun = new Button("Usuń");
        usun.setOnAction(e -> kliknijUsun());

        Button stworzListe = new Button("Zapisz listę");
        stworzListe.setOnAction(e -> zapiszListe());

        HBox pojemnik = new HBox();
        pojemnik.setPadding(new Insets(10, 10, 10, 10));
        pojemnik.setSpacing(10);
        // wstaw pola i przyciski w jeden rząd
        pojemnik.getChildren().addAll(nazwaWejscie, iloscWejscie, dodaj, usun, stworzListe);

        tabela = new TableView<>();
        tabela.setItems(getProdukt());
        tabela.getColumns().addAll(kolumnaNazwa, kolumnaIlosc);

        VBox vBox = new VBox();
        vBox.getChildren().addAll(tabela, pojemnik);

        Scene scena = new Scene(vBox);
        okno.setScene(scena);
        okno.show();
    }

    // Funkcja dodania produktu
    public void kliknijDodaj() {
        Produkt Produkt = new Produkt();
        Produkt.setNazwa(nazwaWejscie.getText());
        Produkt.setIlosc(Double.parseDouble(iloscWejscie.getText()));
        tabela.getItems().add(Produkt);
        nazwaWejscie.clear();
        iloscWejscie.clear();
    }

    // Funkcja usunięcia produktu
    public void kliknijUsun() {
        ObservableList<Produkt> ProduktWybrany, wszystkieProdukty;
        wszystkieProdukty = tabela.getItems();
        ProduktWybrany = tabela.getSelectionModel().getSelectedItems();

        ProduktWybrany.forEach(wszystkieProdukty::remove);
    }

    public ObservableList<Produkt> getProdukt() {
        ObservableList<Produkt> produkty = FXCollections.observableArrayList();
        return produkty;
    }

    // Funkcja dodania listy do pliku
    public void zapiszListe() {

        ArrayList<Produkt> produkty = new ArrayList<Produkt>(tabela.getItems());
        int licznik = 1;
        try {
            File plik = new File("C:\Users\Sebastian\Desktop\lista.txt");
            if (!plik.exists()) {
                plik.createNewFile();
            }
            FileWriter fw = new FileWriter(plik, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);
            for (int i = 0; i < produkty.size(); i++) {
                pw.println(licznik + ". " + produkty.get(i));
                licznik++;
            }
            pw.close();

        } catch (IOException ex) {
            System.out.println("Błąd: ");
            ex.printStackTrace();
        }

    }
}

这是因为FileWriter使用了default encoding,正如javadoc中提到的,我引用:

The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable.

您需要明确定义 encoding 作为下一个示例:

Writer writer = new OutputStreamWriter(new FileOutputStream(plik, true), "UTF-8");

代码中的第二个问题与打印 licznik + ". " + produkty.get(i) 的事实有关,它执行整数“.”和类型 ProduktString 连接为此,您显然没有覆盖方法 toString(),这意味着它调用 Object 中定义的默认实现,只有 returns class 的名称后跟 @ 和对象的十六进制哈希码。换句话说,要解决您的问题,只需在 Produkt

中实现您自己的 toString 方法