Java 如何使程序每次重新打开时都创建新的输出文件名?

Java 如何使程序每次重新打开时都创建新的输出文件名?,java,swing,fileoutputstream,Java,Swing,Fileoutputstream,我有一个程序,目前打开一个图形用户界面,允许用户输入他们的名字以及他们知道的语言。当按下Submit按钮时,当作为可执行JAR文件运行时,它将被转换为控制台输出以及记事本文件。我的问题是,每次我关闭程序并重新打开它时,以前保存的输出都会被删除。我如何绕过这个 可运行代码: package guiChallenge; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; impo

我有一个程序,目前打开一个图形用户界面,允许用户输入他们的名字以及他们知道的语言。当按下Submit按钮时,当作为可执行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);

    }
}

谢谢您的时间。

您每次都可以通过将用户名附加到名为say report_uuu+this name的文件中来创建不同的文件名

编辑:我读了一些你的代码。这里有一件有趣的事情,也许是处理输出的更好方法


您可以减少调用System.out的次数,但只需将要输出的所有内容附加到一个包含换行符ofc的运行字符串中,然后再调用System.out即可。然后,您也可以调用output.write[String here]一次以获得所需的结果

每次都可以通过将用户名附加到名为say report_uu+其名称的文件中来创建不同的文件名

编辑:我读了一些你的代码。这里有一件有趣的事情,也许是处理输出的更好方法


您可以减少调用System.out的次数,但只需将要输出的所有内容附加到一个包含换行符ofc的运行字符串中,然后再调用System.out即可。然后,您也可以调用output.write[String here]一次,以获得所需的结果

因此,这里的问题是您总是在写入report.txt。每次运行代码时,都会覆盖它。不幸的是,处理这个问题有点混乱,因为据我所知,没有一种简单的方法可以跨会话存储您所写的内容,但有几种方法可以做到这一点。以下是第二点:

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转换为字符串的情况下

2检查所有已经存在的文件。 您总是在同一个文件夹中写入,因此您可以充分利用 文件的listFiles方法。它将打印出调用它的文件中的所有文件,这样您就可以看到您写入的内容。我认为它只能在目录上调用,所以你必须先确定你在哪个文件夹中


但我认为第一种方法更容易。如果您真的愿意,您还可以将您使用的名称、报表索引或其他标识符存储在.txt、.cfg、.ini或任何类型的文件中,在程序启动时读取,然后在生成报表时编辑

所以,这里的问题是你总是在写report.txt。每次运行代码时,都会覆盖它。不幸的是,处理这个问题有点混乱,因为据我所知,没有一种简单的方法可以跨会话存储您所写的内容,但有几种方法可以做到这一点。以下是第二点:

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转换为字符串的情况下

2检查所有已经存在的文件。 您总是在同一个文件夹中写入,因此您可以充分利用 文件的listFiles方法。它将打印出调用它的文件中的所有文件,这样您就可以看到您写入的内容。我认为它只能在目录上调用,所以你必须先确定你在哪个文件夹中


但我认为第一种方法更容易。如果您真的愿意,您还可以将您使用的名称、报表索引或其他标识符存储在.txt、.cfg、.ini或任何类型的文件中,在程序启动时读取,然后在生成报表时编辑

FileOutputStream能够追加而不是删除原始文件。只需使用不同的构造函数,如下所示:

    PrintStream output = new PrintStream(new FileOutputStream("Report.txt", true));
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

FileOutputStream能够追加而不是删除原始文件。只需使用不同的构造函数,如下所示:

    PrintStream output = new PrintStream(new FileOutputStream("Report.txt", true));
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

您可以将输出设置为附加而不是覆盖,请参见以下问题:

我拿了你的代码,把你的代码换成了第55行上面的代码,我的文件看起来像这样:

    PrintStream output = new PrintStream(new FileOutputStream("Report.txt", true));
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

因此,您可能希望调整输出中的新行等操作,但除此之外,它看起来还可以。

您可以将输出设置为附加而不是覆盖,请参见以下问题:

我拿了你的代码,把你的代码换成了第55行上面的代码,我的文件看起来像这样:

    PrintStream output = new PrintStream(new FileOutputStream("Report.txt", true));
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

因此,您可能想调整如何在输出中创建新行等,但除此之外,它看起来还不错。

Nice,不知道您可以这样做吗?你知道有没有一种方法可以给用户一个附加或创建新文本文件的选项?你可以包括一个复选框或一些你连接到该字段的东西。比如:打印流输出
ut=new PrintStreamnew FileOutputStreamReport.txt,appendData.isSelected;我个人不喜欢给用户一个清除所有旧数据的选项though@LordFarquaad嗯,如果我做了一个文件选择器,这样他们可以选择保存到一个新文件呢?我不确定在这种情况下我能让他们把它附加到哪里?我想这也应该行得通。我不记得他们是否能在JFileChooser中创建新位置,但我相信你一定能解决这个问题。也许在他们选择一个文件后,如果它存在,你可以弹出一个框,询问他们是否想附加到它。很好,你不知道你可以这样做吗?你知道有没有一种方法可以给用户一个附加或创建新文本文件的选项?你可以包括一个复选框或一些你连接到该字段的东西。Like:PrintStream output=new PrintStreamnew FileOutputStreamReport.txt,appendData.isSelected;我个人不喜欢给用户一个清除所有旧数据的选项though@LordFarquaad嗯,如果我做了一个文件选择器,这样他们可以选择保存到一个新文件呢?我不确定在这种情况下我能让他们把它附加到哪里?我想这也应该行得通。我不记得他们是否能在JFileChooser中创建新位置,但我相信你一定能解决这个问题。也许在他们选择一个文件之后,如果它存在,你可以有一个弹出框来询问他们是否想要附加它。也考虑JavaUTI.PrfsPopy,也可以考虑JavaUTI.PRFFS首选项。