每次重新打开时,如何让我的程序创建一个新的输出文件名?

时间:2016-08-12 15:52:21

标签: java swing fileoutputstream

我有一个程序,它当前打开一个GUI,允许用户输入他们的名字以及他们知道的语言。按下“提交”按钮后,当作为可执行JAR文件运行时,它将转换为控制台输出以及记事本文件。我的问题是,每次我关闭程序并重新打开它,然后删除以前保存的输出。我该如何绕过这个?

可运行代码:

package guiChallenge;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.JCheckBox;
import javax.swing.UIManager;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.awt.event.ActionEvent;

public class guiChallenge extends JFrame {

    /**
     * 
     */
    private JPanel contentPane;
    private JTextField firstNameTextField;
    private JTextField lastNameTextField;
    private JCheckBox javaCheckBox, cCheckBox, c2CheckBox, pythonCheckBox, phpCheckBox, htmlCheckBox;
    String javaLanguage, cLanguage, c2Language, phpLanguage, pythonLanguage, htmlLanguage;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    guiChallenge frame = new guiChallenge();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     * @throws FileNotFoundException 
     */
    public guiChallenge() throws FileNotFoundException {

        PrintStream output = new PrintStream(new FileOutputStream("Report.txt"));
        System.setOut(output);

        setTitle("Programmer Entry");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JPanel namePanel = new JPanel();
        namePanel.setBorder(new TitledBorder(null, "Name", TitledBorder.LEADING, TitledBorder.TOP, null, null));
        namePanel.setBounds(10, 11, 414, 106);
        contentPane.add(namePanel);
        namePanel.setLayout(null);

        JLabel firstNameLabel = new JLabel("First Name: ");
        firstNameLabel.setBounds(10, 18, 81, 33);
        namePanel.add(firstNameLabel);

        JLabel lastNameLabel = new JLabel("Last Name: ");
        lastNameLabel.setBounds(10, 62, 89, 33);
        namePanel.add(lastNameLabel);

        firstNameTextField = new JTextField();
        firstNameTextField.setBounds(79, 24, 155, 20);
        namePanel.add(firstNameTextField);
        firstNameTextField.setColumns(10);

        lastNameTextField = new JTextField();
        lastNameTextField.setColumns(10);
        lastNameTextField.setBounds(79, 68, 155, 20);
        namePanel.add(lastNameTextField);

        JPanel languagesPanel = new JPanel();
        languagesPanel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Languages", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
        languagesPanel.setBounds(10, 128, 414, 122);
        contentPane.add(languagesPanel);
        languagesPanel.setLayout(null);

        javaCheckBox = new JCheckBox("Java");

        javaCheckBox.setBounds(6, 20, 97, 23);
        languagesPanel.add(javaCheckBox);

        cCheckBox = new JCheckBox("C");

        cCheckBox.setBounds(6, 46, 97, 23);
        languagesPanel.add(cCheckBox);

        c2CheckBox = new JCheckBox("C++");

        c2CheckBox.setBounds(6, 72, 97, 23);
        languagesPanel.add(c2CheckBox);

        phpCheckBox = new JCheckBox("PHP");

        phpCheckBox.setBounds(117, 20, 97, 23);
        languagesPanel.add(phpCheckBox);

        pythonCheckBox = new JCheckBox("Python");

        pythonCheckBox.setBounds(117, 46, 97, 23);
        languagesPanel.add(pythonCheckBox);

        htmlCheckBox = new JCheckBox("HTML");

        htmlCheckBox.setBounds(117, 72, 97, 23);
        languagesPanel.add(htmlCheckBox);

        JButton submitUserButton = new JButton("Submit User");
        submitUserButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {


                System.out.println("Applicant Report:");
                System.out.println();
                System.out.println("First Name: " + firstNameTextField.getText() + "    Last Name: " + lastNameTextField.getText());
                System.out.println();
                System.out.println("Languages known: ");

                if(javaCheckBox.isSelected() == true){
                System.out.println("Java");
                }

                if(cCheckBox.isSelected() == true){
                System.out.println("C");
                }

                if(c2CheckBox.isSelected() == true){
                System.out.println("C++");
                }

                if(phpCheckBox.isSelected() == true){
                System.out.println("PHP");
                }

                if(pythonCheckBox.isSelected() == true){
                System.out.println("Python");
                }

                if(htmlCheckBox.isSelected() == true){
                System.out.println("HTML");
                }

                System.out.println("");
                System.out.println("Languages not known: ");

                if(javaCheckBox.isSelected() == false){
                    System.out.println("Java");
                    }

                if(cCheckBox.isSelected() == false){
                    System.out.println("C");
                    }

                if(c2CheckBox.isSelected() == false){
                    System.out.println("C++");
                    }

                if(phpCheckBox.isSelected() == false){
                    System.out.println("PHP");
                    }

                if(pythonCheckBox.isSelected() == false){
                    System.out.println("Python");
                    }

                if(htmlCheckBox.isSelected() == false){
                    System.out.println("HTML");
                    }

                resetPanels();

            }
        });
        submitUserButton.setBounds(220, 46, 184, 23);
        languagesPanel.add(submitUserButton);
    }

    public void resetPanels(){
        firstNameTextField.setText("");
        lastNameTextField.setText("");
        javaCheckBox.setSelected(false);
        cCheckBox.setSelected(false);
        c2CheckBox.setSelected(false);
        phpCheckBox.setSelected(false);
        pythonCheckBox.setSelected(false);
        htmlCheckBox.setSelected(false);

    }
}

感谢您的时间。

4 个答案:

答案 0 :(得分:2)

所以,这里的麻烦是你总是写信给“report.txt”。每次你破坏代码,你都会覆盖它。可悲的是,处理这种情况有点混乱,因为没有简单的方法(我知道)存储你在会话中写的内容,但有几种方法可以做到这一点。这是2:

1)创建运行时名称。你可以这样做:

String name = "report";
int count = 1;
if(new File(name + ".txt").exists()) {
    while(new File(name + count + ".txt").exists()) {
        count++;
    }
    name += "" + count;
}
name += ".txt";

我不确定在""之前+ count是否有必要,但是为了防止您需要将count投放到String,我会说明。

2)检查所有已存在的文件。 你总是写到同一个文件夹,所以你可以利用它 文件的listFiles()方法。它会打印出所调用文件中的所有文件,这样你就可以看到你写的内容了。我认为它只能在目录上调用,所以你必须先找出你所在的文件夹。

我会说第一种方式更容易。如果你真的想要,你也可以存储你使用过的名字,或.txt,.cfg,.ini或任何类型文件中的哪个报告或其他标识符的索引,只需在程序中读取它启动,然后在生成报告时对其进行编辑。

答案 1 :(得分:2)

您可以将输出设置为追加而不是覆盖,请参阅此问题:File Write - PrintStream append

 PrintStream output = new PrintStream(new FileOutputStream("Report.txt", true));

我拿了你的代码,用上面的行切换你的行(行~55),我的文件看起来像这样:

Applicant Report:

First Name: Person    Last Name: TheirLName

Languages known: 
Java

Languages not known: 
C
C++
PHP
Python
HTML
Applicant Report:

First Name: AnotherGuy    Last Name: Doe

Languages known: 
PHP
Python

Languages not known: 
Java
C
C++
HTML

所以,你可能想要调整你在输出中如何做新线等,但除此之外看起来还不错。

答案 2 :(得分:0)

您可以每次创建一个不同的文件名,方法是将用户名添加到名为“report_”+名称的文件中。

编辑:我更多地阅读了您的代码。这是一个有趣的事情,也许是处理输出的更好方法。

您可以减少调用System.out的次数,但只需将要输出的所有内容附加到正在运行的字符串(换行符为c),然后只需调用System.out即可。然后,您也可以拨打output.write([String here])一次以获得所需的结果

答案 3 :(得分:0)

FileOutputStream能够附加而不是删除原始文件。只需使用不同的构造函数:

    PrintStream output = new PrintStream(new FileOutputStream("Report.txt", true));