写入文件但退出时删除?

时间:2012-02-16 20:39:36

标签: java swing file rewrite

我正在尝试在文件中写入一些数据,它写道。但是在重新启动时,它会删除内部的所有内容,然后再次写入。无法找出问题所在。

我还为文件找到了类似“deleteOnClose”的方法,但它没有被设置!所以默认情况下不应该这样做。

提前感谢您的帮助。

这是代码:

主要

 public static void class main {

public main(String args[]){

    menu_secim secimObject=new menu_secim();
}
 }

menu_secim:

 public class menu_secim extends JFrame{

private JButton ekle;
private JButton goster;

public menu_secim() {

    super("Karar Anı");
    this.setLayout(new FlowLayout());
    this.setVisible(true);
    this.setSize(350, 150);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocation(500,300);


    ekle=new JButton("Ekle");
    this.getContentPane().add(ekle);

    goster=new JButton("Göster");
    this.getContentPane().add(goster);

    ekle.setBounds(20,20, 100,60);
    goster.setBounds(120, 20, 100, 60);

    butonHareketleri buton=new butonHareketleri();
    ekle.addActionListener(buton);
    goster.addActionListener(buton);

}
private class butonHareketleri implements ActionListener{

    public void actionPerformed(ActionEvent e){

        if(e.getSource()==ekle)
        try
        {               
            new secim_ekle();   
        }
        catch(Exception h)
        {
        System.out.print("hata var");
        }
    }
}
 }

secim_ekle:

public class secim_ekle extends JFrame {

private JButton ekle;

private JLabel dizi_isim;
private JLabel dizi_puan;
private JLabel kaydet;

private JTextField dizi_isim_fd;
private JTextField dizi_puan_fd;

File dosya=new File("dizi_listesi.txt");

public  secim_ekle() throws IOException{


    super("Ekleme işlemi");
    this.getContentPane().setLayout(null);
    this.setVisible(true);
    this.setSize(500, 150);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocation(500,300);

    final BufferedWriter yazici=new BufferedWriter(new FileWriter(dosya));
    final BufferedReader okuyucu=new BufferedReader(new FileReader(dosya));

    final Formatter yaz=new Formatter(dosya);
    final Scanner oku=new Scanner(dosya);

    ekle=new JButton("Ekle");
    this.getContentPane().add(ekle);

    dizi_isim=new JLabel("Dizi ismi :");
    this.getContentPane().add(dizi_isim);

    dizi_puan=new JLabel("Dizi puan :");
    this.getContentPane().add(dizi_puan);

    kaydet=new JLabel("Veriler Kaydedildi!");
    kaydet.setVisible(false);
    kaydet.setForeground(Color.RED);
    this.getContentPane().add(kaydet);

    dizi_isim_fd=new JTextField();
    this.getContentPane().add(dizi_isim_fd);

    dizi_puan_fd=new JTextField();
    this.getContentPane().add(dizi_puan_fd);

    dizi_isim.setBounds(10, 10, 100, 20);
    dizi_puan.setBounds(10,40,100,20);
    dizi_isim_fd.setBounds(120,10,200,20);
    dizi_puan_fd.setBounds(120,40,50,20);
    ekle.setBounds(350,10,100,20);
    kaydet.setBounds(350, 40, 200, 40);

    ekle.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){

            if(e.getSource()==ekle){
                try{
                    yazici.write(dizi_isim_fd.getText()+"|"+dizi_puan_fd.getText());
                    yazici.newLine();
                    yazici.close();
                    kaydet.setVisible(true);
                }
                catch(Exception h)
                {
                    System.out.print(h.getMessage());
                }
            }

        }
    });

}
  }

5 个答案:

答案 0 :(得分:5)

在此处添加true

final BufferedWriter yazici=new BufferedWriter(new FileWriter(dosya, true));

指定要附加到文件(这是doc)。

答案 1 :(得分:3)

你写的是覆盖所有以前的数据,你需要写入追加模式

这是一个如何: http://www.devdaily.com/java/edu/qanda/pjqa00009.shtml

而不是

final BufferedWriter yazici=new BufferedWriter(new FileWriter(dosya));

使用

final BufferedWriter yazici=new BufferedWriter(new FileWriter(dosya, true));

答案 2 :(得分:2)

您应该在代码中进行两次更改。

有几个人已经提到过第一个:

final BufferedWriter yazici=new BufferedWriter(new FileWriter(dosya, true));

第二次更改:您应该评论以下一行:

final Formatter yaz=new Formatter(dosya);

使用构造函数Formatter(File file)创建Formatter实例时, 如果file存在,则将被截断为零大小

以下代码有效:

package q9318686;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Formatter;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class secim_ekle extends JFrame {

    private JButton ekle;
    private JLabel dizi_isim;
    private JLabel dizi_puan;
    private JLabel kaydet;
    private JTextField dizi_isim_fd;
    private JTextField dizi_puan_fd;
    File dosya = new File("dizi_listesi.txt");

    public secim_ekle() throws IOException {

        super("Ekleme işlemi");
        this.getContentPane().setLayout(null);
        this.setVisible(true);
        this.setSize(500, 150);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocation(500, 300);

        final BufferedWriter yazici = 
                new BufferedWriter(new FileWriter(dosya, true));
        final BufferedReader okuyucu = 
                new BufferedReader(new FileReader(dosya));

// The following line overrides your file:        
//        final Formatter yaz = new Formatter(dosya);
        final Scanner oku = new Scanner(dosya);

        ekle = new JButton("Ekle");
        this.getContentPane().add(ekle);

        dizi_isim = new JLabel("Dizi ismi :");
        this.getContentPane().add(dizi_isim);

        dizi_puan = new JLabel("Dizi puan :");
        this.getContentPane().add(dizi_puan);

        kaydet = new JLabel("Veriler Kaydedildi!");
        kaydet.setVisible(false);
        kaydet.setForeground(Color.RED);
        this.getContentPane().add(kaydet);

        dizi_isim_fd = new JTextField();
        this.getContentPane().add(dizi_isim_fd);

        dizi_puan_fd = new JTextField();
        this.getContentPane().add(dizi_puan_fd);

        dizi_isim.setBounds(10, 10, 100, 20);
        dizi_puan.setBounds(10, 40, 100, 20);
        dizi_isim_fd.setBounds(120, 10, 200, 20);
        dizi_puan_fd.setBounds(120, 40, 50, 20);
        ekle.setBounds(350, 10, 100, 20);
        kaydet.setBounds(350, 40, 200, 40);

        ekle.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                if (e.getSource() == ekle) {
                    try {
                        yazici.write(dizi_isim_fd.getText() + "|" 
                                + dizi_puan_fd.getText());
                        yazici.newLine();
                        yazici.close();
                        kaydet.setVisible(true);
                    } catch (Exception h) {
                        System.out.print(h.getMessage());
                    }
                }

            }
        });
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new secim_ekle().setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }
}

答案 3 :(得分:0)

你需要这样的东西:

FileWriter fileWriter = new FileWriter(dosya,true);
BufferedWriter bufferWriter = new BufferedWriter(fileWriter);

您不断覆盖您的文件而不是附加。

答案 4 :(得分:0)

如果我没有弄错的话,这行代码File dosya=new File("dizi_listesi.txt");保证你每次都会覆盖文件。