您能告诉我下面的代码缺少什么吗?我的代码正在运行,但它没有写入文件。通过文本字段输入的位置。以下是我所拥有的。
public class JFrameNewAccount extends javax.swing.JFrame {
ArrayList<BankAccount> list = new ArrayList<BankAccount>();
BankAccount account = new BankAccount();
public JFrameNewAccount() {
initComponents();
}
private void btnSaveAActionPerformed(java.awt.event.ActionEvent evt) {
account.setAccountName(txt_accountname.getText());
account.setAccountNo(txt_accountnumber.getText());
String fileName = "bank.txt";
FileWriter file = null;
try {
file = new FileWriter(fileName,true);
PrintWriter pw = new PrintWriter(file);
for(BankAccount str: list) {
pw.println(str);
}
pw.flush();
pw.println("\n");
} catch(FileNotFoundException ex) {
JOptionPane.showMessageDialog(this, "Can't create your account!");
} catch (IOException ex) {
Logger.getLogger(JFrameNewAccount.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
file.close();
} catch (IOException ex) {
Logger.getLogger(JFrameNewAccount.class.getName()).log(Level.SEVERE, null, ex);
}
}
请告知。
答案 0 :(得分:1)
您应该尝试下次发布SSCCE。
你的问题是你已经创建了一个ArrayList(即“list”),为ArrayList创建了一个对象(即“account”),向对象添加了数据(通过调用setAccountName和setAccountNo)并试图将ArrayList中的所有内容写入文件。
在任何时候,您都没有将对象设置为ArrayList。
我假设您正在尝试创建一个将数据从屏幕设置到文件中的框架。如果是这样,这就是我要做的。 (更改在ActionPerformed的第1行和第4行)
注意:我没有清理你的代码(如果我可以挑选,我会写一点不同)。回答的目的是向您展示您的代码无法正常工作的原因,这就是问题所在。
public class JFrameNewAccount extends javax.swing.JFrame {
private List<BankAccount> list = new ArrayList<>();
public JFrameNewAccount() {
initComponents();
}
private void btnSaveAActionPerformed(java.awt.event.ActionEvent evt) {
BankAccount account = new BankAccount();
account.setAccountName(txt_accountname.getText());
account.setAccountNo(txt_accountnumber.getText());
list.add(account);
String fileName = "bank.txt";
FileWriter file = null;
try {
file = new FileWriter(fileName,true);
PrintWriter pw = new PrintWriter(file);
for(BankAccount str: list) {
pw.println(str);
}
pw.flush();
pw.println("\n");
} catch(FileNotFoundException ex) {
JOptionPane.showMessageDialog(this, "Can't create your account!");
} catch (IOException ex) {
Logger.getLogger(JFrameNewAccount.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
file.close();
} catch (IOException ex) {
Logger.getLogger(JFrameNewAccount.class.getName()).log(Level.SEVERE, null, ex);
}
}
更新:刚刚看到您的评论。您的解决方案不会为您提供所需的输出,因为您正在尝试编写对象。你需要覆盖它的toString。下面的示例
public class BankAccount {
private String accountName;
private String accountNumber;
@Override
public String toString() {
return "Account Name: \"" + accountName + "\"" + System.getProperty("line.separator") + "Account Number: \"" + accountNumber + "\"";
}
// Setters and getters here
public String getAccountName() {
return accountName;
}
public String getAccountNumber() {
return accountNumber;
}
public void setAccountName(String accountName) {
this.accountName = accountName;
}
public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
}
}
解释 : Streams只会向其中编写字符串。如果您尝试将对象放入System.out.println(),您将获得类似的奇怪的输出。您看到的输出是java中Object类中实现的默认toString(),它显示了类名和对象的哈希码。您可以自定义toString或更改将对象写入文件的方式(通过在内部调用getter)或输出流(即System.out.println())
更新2:如果要使用每个字段之间的新行格式化它,可以使用基于操作系统的“\ n”或“\ r \ n”。最好让Java决定哪一个可以工作。其中一种方法是使用System.getProperty("line.separator")
,但this wonderful Stack Overflow post asking about platform independent new line characters中列出了其他方法。