有没有办法可以检测文本而不覆盖它?

Posted

技术标签:

【中文标题】有没有办法可以检测文本而不覆盖它?【英文标题】:Is there a way where I can detect text and not overwrite it? 【发布时间】:2021-04-10 16:16:43 【问题描述】:

我正在尝试写这个myWriter.write(name + " has scored " + count + " hacker levels in " + duration +" milli-seconds with a delay of " + delay + " milli-seconds.") 到我的 scores.txt 文件中。 我希望 score.txt 文件中的输出如下所示: 在这里写保存然后跳行 在这里写保存然后跳行(一次又一次地重复)

我的问题

每次我按下保存分数按钮时,它都会运行这段代码myWriter.write(name + " has scored " + count + " hacker levels in " + duration +" milli-seconds with a delay of " + delay + " milli-seconds.") 这很好。但是每当我再次按下保存分数按钮时,原始行就会被覆盖,这是我不希望发生的。

我的尝试

我已经尝试了 \r\n 和 BufferedWriter,但它与我想要的结果不匹配。

我的代码

HackerGUI.java

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;

public class HackerGUI extends JFrame


    //jframe components
    private JPanel rootPanel;
    private JButton hack;
    private JLabel time;
    private JButton reset;
    private JLabel description;
    private JLabel title;
    private JLabel gif;
    private JTextField textField1;
    private JButton saveScoresButton;
    private JButton settingsButton;
    private JButton placeholder;

    //timer stuff
    private final Timer timer; //create timer
    private final long duration = 10000; //duration of time
    private long startTime = -1; //start of the time
    private int delay = 300; //delay of when the time starts

    //hacker levels
    private int count = 0;

    public HackerGUI()
    

        add(rootPanel); //add intellij windows builder form

        setTitle("Hacker UI v8.4"); //set the title of the frame

        try 
            File myObj = new File("scores.txt");
            if (myObj.createNewFile()) 
                System.out.println("File created: " + myObj.getName());
                System.out.println("Absolute path: " + myObj.getAbsolutePath());
             else 
                System.out.println("Scores file already exists.");
            
         catch (IOException a) 
            System.out.println("An error occurred.");
            a.printStackTrace();
        

        try 
            File myObj = new File("settings.txt");
            if (myObj.createNewFile()) 
                System.out.println("File created: " + myObj.getName());
                System.out.println("Absolute path: " + myObj.getAbsolutePath());
             else 
                System.out.println("Settings file already exists.");
            
         catch (IOException a) 
            System.out.println("An error occurred.");
            a.printStackTrace();
        

        timer = new Timer(20, new ActionListener()  //timer module
            @Override
            public void actionPerformed(ActionEvent e) 
                if (startTime < 0)  //if time reaches 0, stop time so it doesn't go to negative int
                    startTime = System.currentTimeMillis(); //use system time
                
                long now = System.currentTimeMillis(); //use system time
                long clockTime = now - startTime;
                if (clockTime >= duration)  //whenever clock reaches 0, run command under:
                    clockTime = duration;
                    timer.stop(); //stop the timer from going to the negatives

                    hack.setEnabled(false); //disables hack button as timer went to 0
                    reset.setEnabled(true); //enable reset button to play again

                
                SimpleDateFormat df = new SimpleDateFormat("mm:ss.SSS"); //format of time shown
                time.setText(df.format(duration - clockTime)); //set time component to destination
            
        );
        timer.setInitialDelay(delay); //set the delay

        hack.addActionListener(new ActionListener()  //play action listener, triggers when button is pressed
            @Override
            public void actionPerformed(ActionEvent e) 
                count++; //count in positives and add
                hack.setText("Hacker Level: " + count); //change int and label

                if (!timer.isRunning())  //when button pressed, start timer
                    startTime = -1; //int to when start
                    timer.start(); //start
                
            
        );
        reset.addActionListener(new ActionListener()  //reset action listener, triggers when button is pressed
            @Override
            public void actionPerformed(ActionEvent e) 
                hack.setEnabled(true); //enable hack button to start a new game
                reset.setEnabled(false); //disable reset button as it has been used

                //old command line save score
                String name = textField1.getText(); //get name string
                System.out.println(name + " has scored " + count + " hacker levels in " + duration +" milli-seconds with a delay of " + delay + " milli-seconds."); //print other info
                System.out.println(""); //print spacer
                //old command line save score

                count = count + -count; //count in positive integers
                hack.setText("Hacker Level: " + -count); //reset level score
                time.setText("00:10.000"); //reset time label
            
        );
        saveScoresButton.addActionListener(new ActionListener() 
            @Override
            public void actionPerformed(ActionEvent e) 
                try 
                    FileWriter myWriter = new FileWriter("scores.txt");
                    String name = textField1.getText(); //get name string
                    myWriter.write(name + " has scored " + count + " hacker levels in " + duration +" milli-seconds with a delay of " + delay + " milli-seconds.");
                    myWriter.close();
                    System.out.println("Successfully wrote to the score file.");
                 catch (IOException b) 
                    System.out.println("An error occurred.");
                    b.printStackTrace();
                
            
        );
        settingsButton.addActionListener(new ActionListener() 
            @Override
            public void actionPerformed(ActionEvent e) 
                // TODO: put stuff here
            
        );

        //please don't delete! as this shows credits and help info
        JOptionPane.showMessageDialog(rootPanel,
                "Hacker UI v8.4 is created by _._#3324, thank you for downloading! What is Hacker UI v8.4? It is a clicker game! To know more, read the documentation! https://github.com/udu3324/Hacker-UI-v8.4");

        System.out.println("Hacker UI v8.4: has successfully loaded.");
        System.out.println("=====================================================");
        System.out.println("");
    

    private void createUIComponents() 
        // TODO: place custom component creation code here
    

    public void setData(HackerGUI data) 
    

    public void getData(HackerGUI data) 
    

    public boolean isModified(HackerGUI data) 
        return false;
    

    

Main.java

import javax.swing.*;
import java.net.URL;
import java.util.Arrays;

public class Main 
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, javax.swing.UnsupportedLookAndFeelException
    

        System.out.println("Hello, World!"); //Hello, World!

        

        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

        SwingUtilities.invokeLater(new Runnable() 
            @Override
            public void run() 

                System.out.println("Hacker UI v8.4: is loading..."); //print status of loading

                URL iconURL = getClass().getResource("/images/Hacker UI.png"); //load icon resource
                ImageIcon icon = new ImageIcon(iconURL); //set icon to icon

                HackerGUI hackergui = new HackerGUI(); //make a hacker gui

                hackergui.setIconImage(icon.getImage()); //get icon resource and set as
                hackergui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //terminate when asked on close
                hackergui.setResizable(false); //no resizing
                hackergui.pack(); //wrap it into a pack and set jframe size depending on jframe component size
                hackergui.setLocationRelativeTo(null); //set location to middle of screen
                hackergui.setVisible(true); //set the frame visible
            
        );
    


【问题讨论】:

【参考方案1】:

如果您不想在每次需要追加时都覆盖文本。您可以通过如下方式初始化 FileEriter 来做到这一点:

FileWriter myWriter = new FileWriter("scores.txt", true);

这个构造函数有两个参数,一个是你正在写入的文件,第二个是一个布尔表达式,它决定你是追加到文件还是覆盖它。

如果您想了解更多信息,可以在这里查看: https://www.geeksforgeeks.org/java-program-to-append-a-string-in-an-existing-file/

【讨论】:

以上是关于有没有办法可以检测文本而不覆盖它?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从业力覆盖文本报告器结果中排除所有 100% 或阈值的文件?

有没有办法覆盖 UITextView UIKeyInput 以便可以从超级视图输入文本?

覆盖 jQuery 函数

WPF:有没有办法在不重新定义整个样式的情况下覆盖 ControlTemplate 的一部分?

如何粘贴而不覆盖寄存器

如何粘贴而不覆盖寄存器