使用FileWriter覆盖java中的文件

时间:2014-03-04 09:51:52

标签: java filewriter

我必须完成将一组数据写入文件,使用它,然后用新数据覆盖它的任务。因此,重复发生文件的覆盖。我知道我可以通过每次创建FileWriter对象来完成上述操作,并选择覆盖如下所示

     FileWriter object = new FileWriter("fileName", false)

并关闭它以写入文件。

如果我应该多次覆盖该文件,根据上面的方法我需要创建n个FileWriter对象。是否有任何有效的方法可以通过仅创建单个FileWriter对象来重复覆盖文件?

2 个答案:

答案 0 :(得分:4)

不是直接的答案,但无论如何。

不要这样做!

如果由于某些原因将新数据写入文件失败,您认为会发生什么?

您不仅会丢失原始文件,还会丢失新文件内容......

将新内容写入另一个文件,确保编写好并关闭,然后将新文件原子重命名为原始文件。

PS:不要忘记正确.close()

PS2:如果您使用Java 7,请使用新的Files API。

答案 1 :(得分:0)

最好制作临时文件,然后重命名临时文件并删除旧文件,如下所示:

    public static void nachtragenTRA(File files) throws IOException{

    Scanner sc=null;
        File f= files;
        String analyse = "";
        String NTausgabe = "";
        int max = 0;
        int k = 0;
        String updatedLine[] = new String [4];
        int filenr = 1;
        boolean sucess = false;

        try{
            sc= new Scanner(f);
        }catch(FileNotFoundException x){
            System.out.println("Error: File not found!");
        }
        while (sc.hasNextLine()){                                       //get next line

            analyse = sc.nextLine();

            max = analyse.length();                             //get line lenght

            StringBuffer sb = new StringBuffer(analyse);        //write analyse in StringBuffer 
                                                                //to change the string

            if(k == 1)
            {
                sb.replace(Daten.NTdatapos[3],max, Daten.NTProbentypTextfield.getText());
                updatedLine[0] =String.valueOf(sb);
            }
            else if(k == 2)
            {
                sb.replace(Daten.NTdatapos[4],max, Daten.NTPrueferTextfield.getText());
                updatedLine[1] =String.valueOf(sb);
            }
            else if(k == 3)
            {
                sb.replace(Daten.NTdatapos[5],max, Daten.NTKundeTextfield.getText());
                updatedLine[2] =String.valueOf(sb);
            }
            else if(k == 4)
            {
                sb.replace(Daten.NTdatapos[5],max, Daten.NTWerkstoffTextfield.getText());
                updatedLine[3] =String.valueOf(sb);
            }   

            if(k>3)
            {
                break;
            }

            k++;
        }
        sc.close();


        //NTausgabe=DatenTextarea.getText()+"\n"+updatedLine[0]+"\n"+updatedLine[1];
        //DatenTextarea.setText(String.valueOf(NTausgabe));

        //NTausgabe=DatenTextarea.getText()+"\n"+NTKundeTextfield.getText()+"\n"+NTPrueferTextfield.getText();
        //DatenTextarea.setText(String.valueOf(NTausgabe));


        //create tmp file with the new data
        PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(String.valueOf(f)+".tmp")));
        BufferedReader br = null;
        FileReader reader = null;

        try {
            reader = new FileReader(String.valueOf(f));
            br = new BufferedReader(reader);
            String line;

                while ((line = br.readLine()) != null)
                {
                    //Change speciffic lines
                    if(filenr == 2)
                    {
                        writer.println(updatedLine[0]);
                    }
                    else if(filenr == 3)
                    {
                        writer.println(updatedLine[1]);
                    }
                    else if(filenr == 4)
                    {
                        writer.println(updatedLine[2]);
                    }
                    else if(filenr == 5)
                    {
                        writer.println(updatedLine[3]);
                    }
                    //Andere Zeilen beibehalten
                    else
                    {   
                        writer.println(line);
                    }

                filenr = filenr + 1;
                }

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally{
                reader.close();
                br.close();

                File realName = new File(String.valueOf(f));
                realName.delete();                                              //delete old file
                writer.close();
                sucess = new File(String.valueOf(f)+".tmp").renameTo(realName); //rename tmp File to the others name
                if(sucess != true)
                {
                    NTausgabe=Daten.DatenTextarea.getText()+"\n"+"Rename File failed";
                    Daten.DatenTextarea.setText(String.valueOf(NTausgabe));
                }
                else
                {
                    NTausgabe=Daten.DatenTextarea.getText()+"\n"+"File renamed sucessfully";
                    Daten.DatenTextarea.setText(String.valueOf(NTausgabe));
                }
            }

 }