codestory

Die Anleitung zu Java OutputStreamWriter

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

1. OutputStreamWriter

OutputStreamWriter ist eine Unterklasse von Writer. Sie ist eine Brücke, damit Sie ein byte stream zu einem character stream umwandeln. Anders gesagt, Sie dürfen ein OutputStream zu einem Writer wandeln.
Tipp: Um einen "OutputStream" zu einen "Writer" umzuwandeln, müssen Sie nur diese 2 Wörter verketten, um "OutputStreamWriter" zu bilden, und dann Sie erhalten die Lösung.
OutputStreamWriter​ constructors
OutputStreamWriter​(OutputStream out)     

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

OutputStreamWriter​(OutputStream out, CharsetEncoder enc)
Außer der übergeordneten Klasse geerbten Methoden verfügt OutputStreamWriter über einige eigene Methoden.
Method
Description
String getEncoding()
den Namen der Zeichenkodierung zurückgeben, die durch OutputStreamWriter verwendet wird.

2. UTF-16 OutputStreamWriter

UTF-16 ist eine ziemlich übliche Kodierung (encoding) für Chinesischen oder japanischen Text. In diesem Beispiel werden wir analysieren, wie eine Datei mit der Kodierung UTF-16 geschrieben wird.
Und hier ist der Inhalt, um in die Datei zu schreiben:
JP日本-八洲
In diesem Beispiel verwenden wir UTF-16 OutputStreamWriter , um die Zeichen in einer Datei zu schreiben, und verwenden dann FileInputStream um jede Daten byte dieser Datei zu lesen.
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
Im Java hat das Datentyp char die Größe von 2 bytes, und UTF-16 wird zum Kodieren vom Typ String verwendet. Das Bild unten zeigt die Zeichen in OutputStreamWriter:
Die Analyse der bytes auf die neu erstellten Datei zeigt: die 2 ersten bytes(254, 255) werden verwendet, um zu markieren, dass das ein UTF-16 kodierter Text ist. Sie werden auch als BOM (Byte Order Mark) bezeichnet, die nächsten bytes sind so gleich wie bytes im OutputStreamWriter.

3. UTF-8 OutputStreamWriter

UTF-8 ist die weltweit üblichste Kodierung (encoding). Es kann alle Schriftarten der Welt kodieren, einschließlich chinesischer und japanischer Schriftarten. Ab Java5 war UTF-8 die Standardkodierung zum Lesen und Schreiben von Dateien.
Die von Java generierte Dateien UTF-8 haben keine BOM (Byte Order Mark) (die ersten bytes der Datei zum markieren, dass es sich um eine Datei UTF-8 handelt).
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
Im Java ist der Datentypchar 2 bytes groß und UTF-16 wird verwendet um das Typ String zu kodieren. Das Bild unten zeigt die Zeichen in OutputStreamWriter:
UTF-8 wird viel komplexer als UTF-16 kodiert und es verwendet 1, 2, 3 oder 4 bytes zum Speichern eines Zeichens. Eine detaillierte Analyse der bytes in der neu erstellten Datei UTF-8 zeigt dieses Ding deutlich.
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
Z.B: Das Zeichen "日" hat die Kodenummer von 26085 , die zum Bereich [2048,65535] gehört. UTF-8 braucht 3 bytes um es zu speichern.

Die Anleitungen Java IO

Show More