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

How to read a UTF-8 file in Java

Download Source Code

$ git clone https://github.com/favtuts/java-core-tutorials-examples

$ cd java-io/howto

References

Leave a Reply

Your email address will not be published. Required fields are marked *