在Java中写入文本文件而不覆盖原有内容

24

我正在尝试编写一个方法,如果不存在,则创建“log.txt”文件,然后将数据写入该文件。我遇到的问题是每次调用该方法时,它都会覆盖现有的日志。如何修改该方法,以便不是覆盖数据而只更新文件?

我的写文件方法:

    File log = new File("log.txt")
    try{
    if(log.exists()==false){
            System.out.println("We had to make a new file.");
            log.createNewFile();
    }
    PrintWriter out = new PrintWriter(log);
    out.append("******* " + timeStamp.toString() +"******* " + "\n");
    out.close();
    }catch(IOException e){
        System.out.println("COULD NOT LOG!!");
    }

4
PrintWriter pw = new PrintWriter(new FileWriter(new File(), true));这行代码的作用是创建一个PrintWriter对象,该对象使用FileWriter来写入数据。特别地,该FileWriter使用一个新的空File对象作为输出目标,并且使用追加模式将数据添加到文件的末尾。 - user1181445
9个回答

43

只需将 PrintWriter out = new PrintWriter(log); 更改为

PrintWriter out = new PrintWriter(new FileWriter(log, true));

非常感谢!如果您能解释一下为什么更改参数可以解决问题,我将不胜感激。 - rmp2150
2
从javadoc中可以看到,FileWriter(File file,boolean append)的第二个参数指示文件是否以追加模式打开。 - Qiang Jin
它对我不起作用。我目标文件中只剩下最后一个文本了 :( - Mahdi
1
很好。但我们可以通过编写 new FileWriter(log, true) 来实现。 - Mohd Qasim

13

使用FileWriter代替。

FileWriter(File file, boolean append)

构造函数的第二个参数告诉FileWriter将任何给定的输入附加到文件而不是覆盖它。

以下是您示例的一些代码:

File log = new File("log.txt")

try{
    if(!log.exists()){
        System.out.println("We had to make a new file.");
        log.createNewFile();
    }

    FileWriter fileWriter = new FileWriter(log, true);

    BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    bufferedWriter.write("******* " + timeStamp.toString() +"******* " + "\n");
    bufferedWriter.close();

    System.out.println("Done");
} catch(IOException e) {
    System.out.println("COULD NOT LOG!!");
}

不必包含 if (!log.exists()) { log.createNewFile(); } 块,因为向文件写入内容会在文件不存在时创建它。 - Greg Kopff
2
不必要,因为FileWriter会在文件不存在时尝试隐式创建它。如果无法创建文件,则会抛出IOException异常。 但是添加额外的检查有助于理解,并且在代码中创建了一个防御性点以扩展错误处理。 - thrau

3

由于某些原因,其他方法对我都不起作用...所以我尝试了这个,并且成功了。希望可以帮助到你。

JFileChooser c= new JFileChooser();
c.showOpenDialog(c);
File write_file = c.getSelectedFile();
String Content = "Writing into file\n hi \n hello \n hola";
try 
{
    RandomAccessFile raf = new RandomAccessFile(write_file, "rw");
    long length = raf.length();
    System.out.println(length);
    raf.setLength(length + 1); //+ (integer value) for spacing
    raf.seek(raf.length());
    raf.writeBytes(Content);
    raf.close();
} 
catch (Exception e) {
    System.out.println(e);
}

2
JFileChooser c= new JFileChooser();
c.showOpenDialog(c);
File write_file = c.getSelectedFile();
String Content = "put here the data to be wriiten";
try
    {
    FileWriter fw = new FileWriter(write_file);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.append(Content);
    bw.append("hiiiii");
    bw.close();
    fw.close();
    }
catch(Exception e)
   {
    System.out.println(e);
   `}

这是最简单的方式 - Rohit ZP

1
你甚至可以使用FileOutputStream来获取所需内容。以下是实现方法:
File file = new File(Environment.getExternalStorageDirectory(), "abc.txt");
FileOutputStream fOut = new FileOutputStream(file, true);
OutputStreamWriter osw = new OutputStreamWriter(fOut);
osw.write("whatever you need to write");
osw.flush();
osw.close();

1
你可以更改PrintWriter并使用getAbsoluteFile()方法,该函数返回给定抽象路径名的绝对File对象。
PrintWriter out = new PrintWriter(new FileWriter(log.getAbsoluteFile(), true));

0
这是一个简单的示例,展示了它如何工作。最佳实践是在其中加入try\catch,但对于基本用法,这应该足够了。为此,您需要一个字符串和文件路径,并将其应用于FileWriter和BufferedWriter。这将写入“Hello World”(数据变量),然后换行。每次运行时,它都会将数据变量添加到下一行。
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;


String Data = "Hello World";
File file = new File("C:/Users/stuff.txt");
FileWriter fw = new FileWriter(file,true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(Data);
bw.newLine();
bw.close();

0
BufferedWriter login = new BufferedWriter(new FileWriter("login.txt"));

如果你想在一行代码中创建一个文件,这是一个例子。


0

试试这个

public void writeFile(String arg1,String arg2) {
  try {
   if (!dir.exists()) {

    if (dir.mkdirs()) {

     Toast.makeText(getBaseContext(), "Directory created",
       Toast.LENGTH_SHORT).show();
    } else {
     Toast.makeText(getBaseContext(),
       "Error writng file " + filename, Toast.LENGTH_LONG)
       .show();
    }
   }

   else {

    File file = new File(dir, filename);
    if (!file.exists()) {
     file.createNewFile();
    }
    
    FileWriter fileWritter = new FileWriter(file, true);
    BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
    bufferWritter.write(arg1 + "\n");
    bufferWritter.close();

            } catch (Exception e) {
   e.printStackTrace();
   Toast.makeText(getBaseContext(),
     "Error writng file " + e.toString(), Toast.LENGTH_LONG)
     .show();
  }

 }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接