文件编写器不起作用 [英] file writer doesn't work

查看:48
本文介绍了文件编写器不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用FileWriter和BufferWriter写入文件.文件"test.txt"已创建,但内部未写入任何文件.

I use a FileWriter and a BufferWriter to write in a file. The file "test.txt" is created but nothing is written inside.

该文件应写入我的按钮的ActionEvent中.那是为什么吗?

The file should be written in the ActionEvent of my button. Is that the reason why ?

那是我的代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;  
import java.util.UUID;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

class Cadre_fenetreA2 extends JFrame            
{
    JLabel phrase = new JLabel("Veuillez indiquer le nom de chaque groupe de generalisation pour chaque Niveau");
    JButton boutonOK = new JButton ("OK");
    public Cadre_fenetreA2 (String nom,int X, int Y, int lo, int la, int Na, int [] nbGrpGen,int maxnbGrpGen, File file)        
    {
        super(nom);                     
        setBounds(X,Y,lo,la);       
        setVisible(true);                   


        JTextField[][] allField = new JTextField [Na][maxnbGrpGen];
        JLabel phrases[] = new JLabel [Na];
        String[][] nomGrpGen = new String [Na][maxnbGrpGen];



        setLayout(null);
        for(int i = 0;i < Na;i++)
        {
            for(int j = 0;j<nbGrpGen[i];j++)
            {
                String uuid = UUID.randomUUID().toString();

                 allField[i][j] = new JTextField(uuid.substring(0,8));
                 allField[i][j].setBounds(150+j * 60, 75 + i * 25, 50, 20);
                 add(allField[i][j]);
            }

           phrases[i] = new JLabel("Niveau "+String.valueOf(i+1));
           phrases[i].setBounds(5, 75 + i * 25, 200, 20);

           add( phrases[i]);
        }
        phrase.setBounds(0,0,1000,50);
        add(phrase);
        boutonOK.setBounds(250+maxnbGrpGen*50,25*(Na),60,60);
        add(boutonOK);
        boutonOK.addActionListener(new ecout(Na,nbGrpGen,allField,nomGrpGen, file));
    }

    class ecout implements ActionListener 
    {   
        private int Na;
        private String [][] nomGrpGen ;
        private JTextField[][] allField;
        boolean correct=true;
        private int[] nbGrpGen;
        String chaine;
        File file;


        public ecout(int Na,int[] nbGrpGen, JTextField[][] allField, String[][] nomGrpGen, File file)
        {
            this.file = file;
            this.Na = Na;
            this.nbGrpGen =nbGrpGen;
            this.allField =allField;
            this.nomGrpGen =nomGrpGen;
        }

        public void actionPerformed(ActionEvent evt)
        {
            for(int i = 0;i < Na ;i++)
            {
                for(int j = 0;j < nbGrpGen[i] ;j++)
                {
                nomGrpGen[i][j] = allField[i][j].getText();
                    //chaine=allField[i][j].getText();
                    //nomGrpGen[i][j] ="A";
                  if(nomGrpGen[i][j]=="")
                  {
                      correct=false;
                  }
                }
            } 
            if(correct)
            {
                int i=0;
                int j=0;
                int nbElement;
                JOptionPane jop = new JOptionPane();
                String res;
                do
                {
                    res= jop.showInputDialog(null, "Veuillez indiquer le nombre d'attribut present au depart", "nombre d'attribut",JOptionPane.QUESTION_MESSAGE);
                }
                while(! isInteger(res));
                nbElement =Integer.parseInt(res); 


                int largeur=150+nbElement*30+80;
                int hauteur=30*(nbGrpGen[i])+100;
                if(largeur<600)
                {
                    largeur=600;
                }

                try 
                {
                    FileWriter fw = new FileWriter("test.txt");
                            BufferedWriter out = new BufferedWriter(fw);
                            out.write("aString");
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
                dispose();
                i=0;
                j=0;
                new Cadre_fenetreA3 ("initialisation du groupe"+nomGrpGen[i][j],5,5,largeur, hauteur, nbGrpGen[i], nbElement,nomGrpGen[i], i+1); 
            }
        }
    }
    public boolean isInteger( String input )  
    {  
       try  
       {  
          Integer.parseInt( input );  
          return true;  
       }  
       catch( Exception e)  
       {  
          return false;  
       }  
    }  

}

推荐答案

在这里,

try 
{
    FileWriter fw = new FileWriter("test.txt");
            BufferedWriter out = new BufferedWriter(fw);
            out.write("aString");
} 
catch (IOException e) 
{
    e.printStackTrace();
}

您将其包装在默认缓冲区大小为8KB的BufferedWriter中.因此,只要您不写超过8KB的内容并且不刷新/关闭它,它就不会出现在目标文件中.

You wrapped it in a BufferedWriter which has a default buffer size of 8KB. So as long as you don't write more than 8KB and don't flush/close it, then it won't appear in the target file.

完成后需要关闭编写器.这将刷新所有缓冲区并释放文件上的所有锁.通常的习惯用法是在与创建它相同的try块的finally块中将其关闭.这样,您可以确保在发生异常情况时也将其关闭,从而防止资源泄漏和永久锁定的文件.

You need to close the writer when you're done with it. This will flush any buffers and release any locks on the file. The normal idiom is to close it in the finally block of the very same try block as where it was been created. This way you guarantee that it's also closed in case of exceptions, hereby preventing resource leaking and forever locked files.

Writer writer = null;

try {
    writer = new BufferedWriter(new FileWriter("test.txt"));
    writer.write("aString");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (writer != null) try { writer.close(); } catch (IOException ignore) {}
}

或者,如果您已经在使用Java 7,则还可以使用新的尝试使用资源的声明.当您离开try块时,它将自动关闭资源,从而减少了样板代码.

Alternatively, if you're already on Java 7, then you can also use the new try-with-resources statement. It'll automatically close the resource when you leave the try block, resulting in less boilerplate code.

try (Writer writer = new BufferedWriter(new FileWriter("test.txt"))) {
    writer.write("aString");
} catch (IOException e) {
    e.printStackTrace();
}

顺便说一句,我也将从事异常处理.而是向最终用户显示一些明智的错误消息,而不是将其普通打印到标准输出并进一步忽略它.

By the way, I'd work on exception handling as well. Rather display the enduser some sensible error message instead of plain printing it to the stdout and ignoring it further.

这篇关于文件编写器不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆