0

小さな GUI を持つこの短いプログラムを書きました。テキストを入力してから、それをtxtファイルに保存したり、以前に保存したファイルから読み取ったり、既存のファイルを削除したりできるはずです。動作しますが、奇妙なバグがいくつかあります。ファイルの作成後に削除しようとしても、ファイルが削除されないことがあります。

また、コードを適切に記述したかどうかはまったくわかりません。私が書いたものを見て、私が別の方法で書くべき弱点や領域を見つけることができるかどうか疑問に思っていました. また、作成後にファイルを削除すると問題が発生する理由もわかるかもしれません。私は本当に途方に暮れており、誰に尋ねたらよいかわかりません。ここに私が持っているコードがあります:

public class InputOutout extends JFrame{

    private static final long serialVersionUID = -7073762217756427192L;

    JLabel label;
    JTextField tf;
    JButton buttonAdd;
    JButton buttonDisplay;
    JButton buttonErase;

    public InputOutout() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }

        setLayout(new FlowLayout());

        label = new JLabel("Enter text");
        add(label);

        tf = new JTextField(10);
        add(tf);

        buttonAdd = new JButton("Press to save to file");
        add(buttonAdd);

        buttonDisplay = new JButton("Press to display file content");
        add(buttonDisplay);

        buttonErase = new JButton("Press to erase file");
        add(buttonErase);

        eventAdd add = new eventAdd();
        eventDisplay remove = new eventDisplay();
        eventErase erase = new eventErase();

        buttonAdd.addActionListener(add);
        buttonDisplay.addActionListener(remove);
        buttonErase.addActionListener(erase);       
    }

    private class eventAdd implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            try {
                String word = tf.getText()+ " ";
                FileWriter stream = new FileWriter("text.txt",true);
                BufferedWriter out = new BufferedWriter(stream);
                out.append(word);
                out.close();
                tf.setText("");
            } catch (Exception ex){
                JOptionPane.showMessageDialog(null,ex.getMessage());
            }

        }
    }

    private class eventDisplay implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            try {
                FileReader stream = new FileReader("text.txt");
                BufferedReader in = new BufferedReader(stream);
                String text = in.readLine();
                JOptionPane.showMessageDialog(null, text);
                stream.close();
            } catch (Exception ex){
                JOptionPane.showMessageDialog(null,ex.getMessage());
            }

        }
    }

    private class eventErase implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            try {
                File file = new File("text.txt");
                boolean success = file.delete();

                if (!success) {
                    JOptionPane.showMessageDialog(null, "File was not deleted");
                } else {
                    JOptionPane.showMessageDialog(null, "File was deleted");
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null,ex.getMessage());
            }
        }
    }

    public static void main(String[] args) {

        InputOutout gui = new InputOutout();

        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(350,100);
        gui.setTitle("SuperWORD 2013");
        gui.setVisible(true);       
    }
}
4

1 に答える 1

2

を取り巻くロジックfile.delete()は完全に正しくありませんtrue。削除された場合にのみ返されます。これは、それが存在しない場合にfile.delete()戻ることを意味します。falseファイルを削除する前に、ファイルが存在するかどうかを確認してください。

File file = new File("text.txt");
if (file.exists())
{
    if (!file.delete())
    {
        JOptionPane.showMessageDialog(null, "File was not deleted");
    }
    else
    {
        JOptionPane.showMessageDialog(null, "File was deleted");
    }
}
else
{
    JOptionPane.showMessageDialog(null, "File does not exist");
}

try {} catch() finally {}を確実にするために構成を使用することをお勧めしますBufferedReader.close()、またはBufferedWriter.close()呼び出されます:

try
{
    BufferedWriter out = new BufferedWriter(new FileWriter("text.txt",true));
    try
    {
        String word = tf.getText()+ " ";
        out.append(word);
        tf.setText("");
    }
    finally
    {
        try
        {
            out.close();
        }
        catch (IOException ex)
        {
            // Report close failure.
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }
}
catch (Exception ex)
{
    // Report open or write failure.
    JOptionPane.showMessageDialog(null,ex.getMessage());
}
于 2012-06-25T19:38:24.820 に答える