devstory

Le Tutoriel de Java OutputStreamWriter

View more Tutorials:

Site d'apprentissage des langues gratuit:
Suivez-nous sur notre fanpage pour recevoir des notifications chaque fois qu'il y a de nouveaux articles. Facebook

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.
MethodDescription
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.

View more Tutorials: