麻烦附加到java中的文本文件。可以创建.txt文件并添加数据,但会被覆盖

时间:2012-06-05 02:47:00

标签: java swing file-io io

好的,首先......是的,这是一个家庭作业问题。我被卡住了。我已经能够创建.txt文件并从GUI文本字段中保存数据。只要我不退出GUI,它就会继续添加到文件中。一旦我再次启动它,下次保存任何内容时整个文件都会被覆盖(单击GUI上的保存按钮)。 我想做的是:

- 从GUI文本字段输入数据     - 单击“保存”按钮(创建文件并将数据附加到.txt文件)     - 能够从文件读回面板     - 能够关闭并重新打开GUI并根据需要附加.txt文件

我很亲密,但我害怕我做一些愚蠢的事情。 下面是我的GUI的Java代码,CreateTextFile和ReadTextFile

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;

import javax.swing.*;

public class DonorGUI extends JFrame
{

    // Components
    private JPanel panel;
    private JTextArea results;
    private JButton entryButton;
    private JButton exitButton;
    private JButton clearButton;
    private JButton saveButton;
    private JButton openButton;
    private JTextField donorField;
    private JTextField charityField;
    private JTextField pledgeField;

    //create variables
    String[] donorName = new String[20];
    String[] charityName = new String[20];
    double[] donationAmt = new double[20];
    int i = 0;


    // Constants for the window size
    private final int WINDOW_WIDTH = 750;
    private final int WINDOW_HEIGHT = 525;

    //Constructor
    public DonorGUI(){

        // Set the title.
        setTitle("Wounded Warrior Donation Tracker.");

        // Specify what happens when the close button is clicked.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Build the panel that contains the other components.
        buildPanel();

        // Add the panel to the content pane.
        add(panel);

        // Size and display the window.
        setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        setVisible(true);
    }

    //The buildPanel method creates a panel containing other components.
    private void buildPanel(){

        // Create labels to display instructions.
        JLabel message1 = new JLabel("Name of the Donor:");
        JLabel message2 = new JLabel("Name of the Charity:");
        JLabel message3 = new JLabel("Amount of the Pledge:");

        //instantiate the results area
        results = new JTextArea(25,60);
        results.setEditable(false);
        results.setWrapStyleWord(true);
        results.setLineWrap(true);
        results.setBorder(BorderFactory.createLoweredBevelBorder());


        // Create text fields to receive user input
        donorField = new JTextField(10);
        charityField = new JTextField(10);
        pledgeField = new JTextField(10);


        //create the user buttons to cause action
        entryButton = new JButton("Enter Donation.");
        entryButton.addActionListener(new EntryButtonListener());
        exitButton = new JButton("EXIT");
        exitButton.addActionListener(new ExitButtonListener());
        clearButton = new JButton ("Clear Fields");
        clearButton.addActionListener(new ClearButtonListener());
        saveButton = new JButton ("Save");
        saveButton.addActionListener(new SaveButtonListener());
        openButton = new JButton ("Open");
        openButton.addActionListener(new OpenButtonListener());

        // Create a panel.
        panel = new JPanel();
        panel.setBackground(Color.orange);

        //set the LayoutManager
        panel.setLayout(new FlowLayout());

        // Add the labels, text fields, and button to the panel.
        panel.add(message1);
        panel.add(donorField);
        panel.add(message2);
        panel.add(charityField);
        panel.add(message3);
        panel.add(pledgeField);
        panel.add(results);
        panel.add(entryButton);
        panel.add(clearButton);
        panel.add(saveButton);
        panel.add(openButton);
        panel.add(exitButton);      
    }
    private class EntryButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            donorName[i] = donorField.getText();
            charityName[i] = charityField.getText();
            if (donationAmt(pledgeField.getText())) {
                  donationAmt[i] = Double.parseDouble(pledgeField.getText());
            }else{
                donorField.setText("");
                charityField.setText("");
                pledgeField.setText("");
            }
            results.append(donorName[i]+" "+charityName[i]+" "+donationAmt[i]+"\n ");
            donorField.setText("");
            charityField.setText("");
            pledgeField.setText("");
            i++;
        } 
    }
    public boolean donationAmt(String amount) {

        if(amount==null || amount=="" || amount.length()<1){  //checking for empty field
            JOptionPane.showMessageDialog(null, "Please enter amount pledged");
            return false;
        }
        for(int i = 0; i < amount.length(); i++){  //verifying dollar amount entered as number
                if (!Character.isDigit(amount.charAt(i)) && amount.charAt(i)!='.'){ 
                    JOptionPane.showMessageDialog(null, "Invalid input.");
                    return false;
                } 
        }
        return true;

    }  
    private class ClearButtonListener implements ActionListener {

        public void actionPerformed (ActionEvent e) {
            donorField.setText("");
            charityField.setText("");
            pledgeField.setText("");
            }
    }
    private class ExitButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }
    private class SaveButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            CreateTextFile cr = new CreateTextFile();
            cr.openFile();
            cr.addRecords(donorName, charityName, donationAmt);
            cr.closeFile();

            JavaDBClass db = new JavaDBClass();



        }

    }
    private class OpenButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            ReadTextFile read = new ReadTextFile();
            read.openFile();
            DonorGUI donor = read.readRecords();
            read.closeFile();           
            JavaDBClass db = new JavaDBClass(donor);
            for(int i = 0;i<donor.donationAmt.length;i++){

                try {
                    results.append(db.showTable()[i]+"\n");
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

            }
        }

    }

    /* Application method */
    public static void main(String[] args){

        DonorGUI rpc = new DonorGUI();
    }
}

创建文本文件JAVA代码:

/** This will create a text file based on user input and save it as donations.txt.
 * 
 */
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.FormatterClosedException;
import java.util.NoSuchElementException;

public class CreateTextFile {

    //object that outputs text to a file
    private Formatter output;

    //try opening a file
    public void openFile(){

        try
        {
            output = new Formatter("C:/PRG421_Data/donations.txt");
        }
        catch (SecurityException securityException)
        {
            System.out.println("You cannot write to this file.");
        }
        catch (FileNotFoundException notFoundException)
        {
            System.out.println("You couldn't open or find the file.");
        }

    }
    //try writing to the file
    public void addRecords(String[] donor, String[] charity, double[] donation){

                try{
                     for (int j=0; j<donor.length; j++) {
                         if (donor[j] != null) {
                            output.format("\n%s %s %.2f",donor[j],charity[j],donation[j]);

                           }
                     }
              }

              catch (FormatterClosedException formatterClosedException){

                     System.out.println("You couldn't write to this file.");

              }

              catch (NoSuchElementException elementException){

                     System.out.println("Invalid Input.");

              }

       }
    //try closing the file
    public void closeFile(){
        if(output!=null)
            output.close();
    }
}

阅读文本文件JAVA代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadTextFile {

    private Scanner input;

    //try to open the file
    public void openFile(){
        try{
            input = new Scanner(new File("C:/PRG421_Data/donations.txt"));
        }
        catch (FileNotFoundException fileNotFoundException)
        {
            System.out.println("File not found.");
            System.exit(1);
        }
    }
    //try to read from the file
    public DonorGUI readRecords(){

        DonorGUI gui = new DonorGUI();

        while(input.hasNext())
        {
            for(int j = 0;j<20;j++){
            gui.donorName[j] = input.next();
            gui.charityName[j] = input.next();
            gui.donationAmt[j] = input.nextDouble();
            }
        }
        return gui;

    }
    //try to close the file
    public void closeFile(){
        if(input!=null)
            input.close();

    }
}

2 个答案:

答案 0 :(得分:5)

而不是

 output = new Formatter("C:/PRG421_Data/donations.txt");

使用

output = new Formatter(new FileOutputStream("C:/PRG421_Data/donations.txt", true));

true参数表示追加。

答案 1 :(得分:4)

output = new Formatter("C:/PRG421_Data/donations.txt");

AFAIK这将覆盖现有的File。构造函数需要String而不是OuputStream,而不是{{1}}。