In Java, the OutputStreamWriter accepts a charset to encode the character streams into byte streams. We can pass a StandardCharsets.UTF_8 into the OutputStreamWriter constructor to write data to a UTF-8 file.
try (FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(osw)) {
writer.append(line);
}
In Java 7+, many File I/O and NIO writers start to accept charset as an argument, making write data to a UTF-8 file very easy, for examples:
// Java 7 Files.write(path, lines, StandardCharsets.UTF_8); // Java 8 Files.newBufferedWriter(path) // default UTF-8 // Java 11 new FileWriter(new File(fileName), StandardCharsets.UTF_8);
1. Write to UTF-8 file
This example shows a few ways to write some Chinese characters to a UTF-8 file.
UnicodeWrite.java
package com.favtuts.io.howto;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
public class UnicodeWrite {
public static void main(String[] args) {
String fileName = "/home/tvt/workspace/favtuts/unicode.txt";
List<String> lines = Arrays.asList("line 1", "line 2", "line 3", "你好,世界");
//writeUnicodeClassic(fileName, lines);
//writeUnicodeJava7(fileName, lines);
//writeUnicodeJava8(fileName, lines);
writeUnicodeJava11(fileName, lines);
System.out.println("Done");
}
// in the old days
public static void writeUnicodeClassic(String fileName, List<String> lines) {
File file = new File(fileName);
try (FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(osw)
) {
for (String line : lines) {
writer.append(line);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// Java 7
public static void writeUnicodeJava7(String fileName, List<String> lines) {
Path path = Paths.get(fileName);
try {
Files.write(path, lines, StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
}
// Java 8 - Files.newBufferedWriter(path) - default UTF-8
public static void writeUnicodeJava8(String fileName, List<String> lines) {
Path path = Paths.get(fileName);
try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
for (String line : lines) {
writer.append(line);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// Java 11 adds Charset to FileWriter
public static void writeUnicodeJava11(String fileName, List<String> lines) {
try (FileWriter fw = new FileWriter(new File(fileName), StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(fw)
) {
for (String line : lines) {
writer.append(line);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Output

Further Reading
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-io/howto