我有一个程序,它当前打开一个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);
}
}
感谢您的时间。
答案 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));