1. Overview

In this tutorial, we’ll learn and understand the FileWriter class present in the java.io package.

2. FileWriter

FileWriter is a specialized OutputStreamWriter for writing character files. It doesn’t expose any new operations but works with the operations inherited from the OutputStreamWriter and Writer classes.

Until Java 11, the FileWriter worked with the default character encoding and default byte buffer size. However, Java 11 introduced four new constructors that accept a Charset, thereby allowing user-specified Charset. Unfortunately, we still cannot modify the byte buffer size, and it’s set to 8192.

2.1. Instantiating the FileWriter

There are five constructors in the FileWriter class if we’re using a Java version before Java 11.

Let’s have a glance at various constructors:

public FileWriter(String fileName) throws IOException {
    super(new FileOutputStream(fileName));
}

public FileWriter(String fileName, boolean append) throws IOException {
    super(new FileOutputStream(fileName, append));
}

public FileWriter(File file) throws IOException {
    super(new FileOutputStream(file));
}

public FileWriter(File file, boolean append) throws IOException {
    super(new FileOutputStream(file, append));
}

public FileWriter(FileDescriptor fd) {
    super(new FileOutputStream(fd));
}

Java 11 introduced four additional constructors:

public FileWriter(String fileName, Charset charset) throws IOException {
    super(new FileOutputStream(fileName), charset);
}

public FileWriter(String fileName, Charset charset, boolean append) throws IOException {
    super(new FileOutputStream(fileName, append), charset);
}

public FileWriter(File file, Charset charset) throws IOException {
    super(new FileOutputStream(file), charset);
}

public FileWriter(File file, Charset charset, boolean append) throws IOException {
    super(new FileOutputStream(file, append), charset);
}

2.2. Writing a String to a File

Let’s now use one of the FileWriter constructors to create an instance of FileWriter and then write to a file:

try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) {
    fileWriter.write("Hello Folks!");
}

We’ve used the single argument constructor of the FileWriter that accepts a file name.  We then use the write(String str) operation inherited from the Writer class. Since the FileWriter is AutoCloseable, we’ve used try-with-resources so that we don’t have to close the FileWriter explicitly.

On executing the above code, the String will be written to the specified file:

Hello Folks!

The FileWriter does not guarantee whether the FileWriterTest.txt file will be available or be created. It is dependent on the underlying platform.

We must also make a note that certain platforms may allow only a single FileWriter instance to open the file. In that case, the other constructors of the FileWriter class will fail if the file involved is already open.

2.3. Appending a String to a File

We often need to append data to the existing contents of a file. Let’s now see an example of a FileWriter that supports appending:

try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", true)) {
    fileWriter.write("Hello Folks Again!");
}

As we can see, we’ve used the two-argument constructor that accepts a file name and a boolean flag append. Passing the flag append as true creates a FileWriter that allows us to append text to existing contents of a file.

On executing the code, we’ll have the String appended to the existing contents of the specified file:

Hello Folks!Hello Folks Again!

3. Conclusion

In this article, we learned about the convenience class FileWriter and a couple of ways in which the FileWriter can be created. We then used it to write data to a file.

As always, the complete source code for the tutorial is available over on GitHub.