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)
的事实有关,它执行整数“.”和类型 Produkt
的 String
连接为此,您显然没有覆盖方法 toString()
,这意味着它调用 Object
中定义的默认实现,只有 returns class 的名称后跟 @ 和对象的十六进制哈希码。换句话说,要解决您的问题,只需在 Produkt
中实现您自己的 toString
方法
我希望这个程序在 .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)
的事实有关,它执行整数“.”和类型 Produkt
的 String
连接为此,您显然没有覆盖方法 toString()
,这意味着它调用 Object
中定义的默认实现,只有 returns class 的名称后跟 @ 和对象的十六进制哈希码。换句话说,要解决您的问题,只需在 Produkt
toString
方法