devstory

Le Tutoriel de Java OutputStreamWriter

  1. OutputStreamWriter
  2. UTF-16 OutputStreamWriter
  3. UTF-8 OutputStreamWriter

1. OutputStreamWriter

OutputStreamWriter est une sous-classe de Writer, c'est un pont qui vous permet de convertir un byte stream en un character stream, en d'autres termes, il vous permet de convertir un OutputStream en Writer.
Astuce: Pour convertir un "OutputStream" en un "Writer", il vous suffit de concaténer ces deux mots pour former "OutputStreamWriter" et vous obtiendrez la solution.
OutputStreamWriter​ constructors
OutputStreamWriter​(OutputStream out)     

OutputStreamWriter​(OutputStream out, String charsetName)     
 
OutputStreamWriter​(OutputStream out, Charset cs)     

OutputStreamWriter​(OutputStream out, CharsetEncoder enc)
Outre ces méthodes héritées de la superclasse, OutputStreamWriter a quelques autres méthodes qui lui sont propres.
Method
Description
String getEncoding()
Renvoie le nom du codage de caractères utilisé par OutputStreamWriter.

2. UTF-16 OutputStreamWriter

UTF-16 est un codage (encoding) assez courant pour le texte chinois ou japonais. Dans cet exemple, on analysera la manière d'écrire un fichier en utilisant le codage UTF-16.
Et voici le contenu à écrire dans le fichier:
JP日本-八洲
Dans cet exemple, on utilise UTF-16 OutputStreamWriter pour écrire les caractères dans un fichier, ensuite, on utilise FileInputStream pour lire chaque byte de ce fichier.
OutputStreamWriter_UTF16_Ex1.java
package org.o7planning.outputstreamwriter.ex;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;

public class OutputStreamWriter_UTF16_Ex1 {

    private static final String filePath = "/Volumes/Data/test/utf16-file-out.txt";
    
    public static void main(String[] args) throws IOException {
        System.out.println(" --- Write UTF-16 File --- ");
        write_UTF16_Character_Stream();
        
        System.out.println(" --- Read File as Binary Stream --- ");
        readAs_Binary_Stream();
    }

    private static void write_UTF16_Character_Stream() throws IOException   {
        File outFile = new File(filePath);
        outFile.getParentFile().mkdirs(); // Create parent folder.

        // Create OutputStream to write a file.
        OutputStream os = new FileOutputStream(outFile);

        // Create a OutputStreamWriter  
        OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_16);

        String s = "JP日本-八洲";
        osw.write(s);
        osw.close();
    }

    private static void readAs_Binary_Stream() throws IOException {
        InputStream is = new FileInputStream(filePath);

        int byteValue;
        while ((byteValue = is.read()) != -1) { // Read byte by byte.
            System.out.println((char) byteValue + "  " + byteValue);
        }
        is.close();
    }
}
Output:
--- Write UTF-16 File ---
 --- Read File as Binary Stream ---
þ  254
ÿ  255
  0
J  74
  0
P  80
e  101
å  229
g  103
,  44
  0
-  45
Q  81
k  107
m  109
2  50
Dans Java, le type de données char a une taille de 2 bytes et UTF-16 est utilisé pour encoder le type String. L'image ci-dessous montre les caractères sur OutputStreamWriter:
On voit qu'à partir de l'analyse des bytes sur le fichier nouvellement créé: les 2 premiers bytes (254, 255) sont utilisés pour marquer qu'il s'agit d'un texte encodé en UTF-16. Ils sont également connus sous le nom de BOM (Byte Order Mark), les bytes suivants sont les mêmes que les bytes sur OutputStreamWriter.

3. UTF-8 OutputStreamWriter

UTF-8 est l'encodage le plus populaire au monde. Il peut encoder toutes les écritures du monde, y compris les caractères chinois et japonais. À partir de Java5, UTF-8 est l'encodage par défaut pour la lecture et l'écriture de fichiers.
Les fichiers UTF-8 créés par Java n'ont pas de BOM (Byte Order Mark) (les premiers bytes du fichier pour marquer qu'il s'agit d'un fichier UTF-8).
OutputStreamWriter_UTF8_Ex1.java
package org.o7planning.outputstreamwriter.ex;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;

public class OutputStreamWriter_UTF8_Ex1 {

    private static final String filePath = "/Volumes/Data/test/utf8-file-out.txt";
    
    public static void main(String[] args) throws IOException {
        System.out.println(" --- Write UTF-8 File --- ");
        write_UTF8_Character_Stream();
        
        System.out.println(" --- Read File as Binary Stream --- ");
        readAs_Binary_Stream();
    }

    private static void write_UTF8_Character_Stream() throws IOException   {
        File outFile = new File(filePath);
        outFile.getParentFile().mkdirs(); // Create parent folder.

        // Create OutputStream to write a file.
        OutputStream os = new FileOutputStream(outFile);

        // Create a OutputStreamWriter  
        OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);

        String s = "JP日本-八洲";
        osw.write(s);
        osw.close();
    }

    private static void readAs_Binary_Stream() throws IOException {
        InputStream is = new FileInputStream(filePath);

        int byteValue;
        while ((byteValue = is.read()) != -1) { // Read byte by byte.
            System.out.println((char) byteValue + "  " + byteValue);
        }
        is.close();
    }
}
Output:
--- Write UTF-8 File ---
 --- Read File as Binary Stream ---
J  74
P  80
æ  230
—  151
¥  165
æ  230
œ  156
¬  172
-  45
å  229
…  133
«  171
æ  230
´  180
²  178
Dans Java, le type de données char a une taille de 2 bytes et UTF-16 est utilisé pour encoder le type String. L'image ci-dessous montre les caractères sur OutputStreamWriter:
UTF-8 est codé de manière beaucoup plus complexe que UTF-16, il utilise 1, 2, 3 ou 4 bytes pour stocker un caractère. Une analyse détaillée des bytes du fichier UTF-8 nouvellement créé le démontre clairement.
Number of bytes
From
To
Byte 1
Byte 2
Byte 3
Byte 4
1
U+0000
0
U+007F
127
0xxxxxxx
2
U+0080
128
U+07FF
2047
110xxxxx
10xxxxxx
3
U+0800
2048
U+FFFF
65535
1110xxxx
10xxxxxx
10xxxxxx
4
U+10000
65536
U+10FFFF
1114111
11110xxx
10xxxxxx
10xxxxxx
10xxxxxx
Par exemple, le caractère "日" a le code 26085, dans la sphère [2048,65535], UTF-8 a besoin de 3 bytes pour le stocker.

Tutoriels Java IO

Show More