保存在ArrayLists中但输出错误写入文件

时间:2013-05-29 07:11:00

标签: java swing arraylist textfield

您能告诉我下面的代码缺少什么吗?我的代码正在运行,但它没有写入文件。通过文本字段输入的位置。以下是我所拥有的。

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);
       }
    }

请告知。

1 个答案:

答案 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中列出了其他方法。