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