我需要在Java中反复向现有文件追加文本。我怎么做呢?


当前回答

你也可以试试这个:

JFileChooser c= new JFileChooser();
c.showOpenDialog(c);
File write_file = c.getSelectedFile();
String Content = "Writing into file"; //what u would like to append to the file



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) {
    //any exception handling method of ur choice
}

其他回答

使用java.nio.Files和java.nio.file.StandardOpenOption

    PrintWriter out = null;
    BufferedWriter bufWriter;

    try{
        bufWriter =
            Files.newBufferedWriter(
                Paths.get("log.txt"),
                Charset.forName("UTF8"),
                StandardOpenOption.WRITE, 
                StandardOpenOption.APPEND,
                StandardOpenOption.CREATE);
        out = new PrintWriter(bufWriter, true);
    }catch(IOException e){
        //Oh, no! Failed to create PrintWriter
    }

    //After successful creation of PrintWriter
    out.println("Text to be appended");

    //After done writing, remember to close!
    out.close();

这将使用Files创建一个BufferedWriter,它接受StandardOpenOption参数,并从结果BufferedWriter创建一个自动刷新的PrintWriter。然后可以调用PrintWriter的println()方法来写入文件。

这段代码中使用的StandardOpenOption参数:打开文件进行写入,仅追加到文件中,并在文件不存在时创建文件。

路径。get("path here")可以用new File("path here"). topath()代替。 和字符集。forName(“字符集名称”)可以修改以适应所需的字符集。

对于JDK版本>= 7

你可以使用这个简单的方法将给定的内容追加到指定的文件:

void appendToFile(String filePath, String content) {
  try (FileWriter fw = new FileWriter(filePath, true)) {
    fw.write(content + System.lineSeparator());
  } catch (IOException e) { 
    // TODO handle exception
  }
}

我们正在以追加模式构造FileWriter对象。

最好使用try-with-resources,而不是java 7之前的所有业务

static void appendStringToFile(Path file, String s) throws IOException  {
    try (BufferedWriter out = Files.newBufferedWriter(file, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
        out.append(s);
        out.newLine();
    }
}
FileOutputStream fos = new FileOutputStream("File_Name", true);
fos.write(data);

true允许在现有文件中追加数据。如果我们写

FileOutputStream fos = new FileOutputStream("File_Name");

它将覆盖现有文件。所以选择第一种方法。

如果我们使用Java 7及以上版本,并且也知道要添加(追加)到文件的内容,我们可以使用NIO包中的newBufferedWriter方法。

public static void main(String[] args) {
    Path FILE_PATH = Paths.get("C:/temp", "temp.txt");
    String text = "\n Welcome to Java 8";

    //Writing to the file temp.txt
    try (BufferedWriter writer = Files.newBufferedWriter(FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
        writer.write(text);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这里有几点需要注意:

指定字符集编码总是一个好习惯,为此我们在StandardCharsets类中有常量。 代码使用try-with-resource语句,其中资源在try之后自动关闭。

虽然OP没有要求,但以防我们想要搜索具有特定关键字的行,例如confidential,我们可以在Java中使用流api:

//Reading from the file the first line which contains word "confidential"
try {
    Stream<String> lines = Files.lines(FILE_PATH);
    Optional<String> containsJava = lines.filter(l->l.contains("confidential")).findFirst();
    if(containsJava.isPresent()){
        System.out.println(containsJava.get());
    }
} catch (IOException e) {
    e.printStackTrace();
}