1. Ursprung des Zeichenstroms Gibt es ein Problem beim Kopieren von Textdateien mit chinesischen Zeichen im Bytestream?
Weil die zugrunde liegende Operation Bytes automatisch in Chinesisch zusammenfügt.
Wie erkennt man, dass das Byte chinesisch ist?
Wenn chinesische Zeichen gespeichert werden, sei es UTF-8 oder GBK, ist das erste Byte eine negative Zahl zur Eingabeaufforderung
2. Codierungstabelle
Zeichensatz:
ist ein Satz aller vom System unterstützten Zeichen. einschließlich nationaler Zeichen, Satzzeichen, grafischer Symbole, Zahlen usw.
Um verschiedene Zeichensatzsymbole genau zu speichern und zu erkennen, muss ein Computer eine Zeichenkodierung durchführen. Ein Satz von Zeichensätzen muss mindestens einen Satz von Zeichenkodierungen haben
Zu den gängigen Zeichensätzen gehören der ASCII-Zeichensatz, der GBXXX-Zeichensatz, der Unicode-Zeichensatz usw.
GBK: Die am häufigsten verwendete chinesische Codetabelle ist eine erweiterte Spezifikation, die auf dem GB2312-Standard basiert. Sie verwendet ein Doppelbyte-Codierungsschema und enthält eine Insgesamt 21.003 chinesische Schriftzeichen. Es ist vollständig kompatibel mit dem GB2312-Standard und unterstützt auch traditionelle chinesische Schriftzeichen, japanische und koreanische chinesische Schriftzeichen usw.
GB18030: Die neueste chinesische Codetabelle mit 70244 chinesischen Schriftzeichen und Multibyte-Kodierung. Jedes Zeichen kann aus 1, 2 oder 4 Bytes bestehen. Unterstützt die Zeichen chinesischer ethnischer Minderheiten sowie traditionelle chinesische Zeichen, japanische und koreanische chinesische Zeichen usw.
Unicode-Zeichensatz:
Entwickelt, um jedes Zeichen in jeder Sprache auszudrücken, ist es ein auch bekannter Standard in der Branche als Unicode und Standard-Unicode; es werden bis zu 4 Bytes an Zahlen verwendet, um jeden Buchstaben, jedes Symbol oder jeden Text darzustellen. Es gibt drei Codierungsschemata: UTF-8, UTF-16, UTF32. Das am häufigsten verwendete ist UTF-8
UTF-8: Es kann zur Darstellung jedes Zeichens im Unicode-Standard verwendet werden Seiten und andere Speicherung oder Übertragung Bei Dateianwendungen wird die Kodierung bevorzugt. Die Internet Working Group fordert, dass alle Internetprotokolle das UTF-8-Kodierungsformat unterstützen müssen. Zur Codierung jedes Zeichens werden ein bis vier Bytes verwendet.
UTF-8-Codierungsregeln:
128 US-ASCII-Zeichen, benötigen nur ein Byte zum Codieren.
Lateinische und andere Zeichen benötigen zwei Bytes zum Codieren.
Am häufigsten verwendete Zeichen (einschließlich Chinesisch) werden mit drei Bytes codiert
Andere selten verwendete UniCode-Hilfszeichen werden mit vier Bytes codiert
Zusammenfassung: Welche Art von Regeln werden beim Codieren verwendet und entsprechende Regeln müssen zum Decodieren verwendet werden, sonst wird es verstümmelt
3. Codierungs- und Decodierungsprobleme in Strings
Codierungsmethode (IDEA):
byte[] getBytes(): Verwenden Sie den Standardzeichensatz der Plattform, um den String in eine Reihe von Bytes zu codieren, und konvertieren Sie das Ergebnis in einen neues Byte-Array
byte[] getBytes(String charsetName): Verwenden Sie den angegebenen Zeichensatz, um den String in eine Reihe von Bytes zu kodieren und das Ergebnis in einem neuen Byte-Array zu speichern
Dekodierungsmethode (IDEA):
String( byte[]bytes): Konstruiert einen neuen String durch Dekodierung des angegebenen Byte-Arrays mit dem Standardzeichensatz der Plattform.
String(byte[]bytes,String charsetName): Dekodierung des angegebenen Byte-Arrays mit dem Standardzeichensatz der Plattform. Zu erstellendes Byte-Array ein neuer String
Das Standardkodierungsformat in IDEA ist UTF-8
IV Probleme bei der Kodierung und Dekodierung des Zeichenstroms
Abstrakte Basisklasse des Zeichenstroms:
Reader: Abstrakte Klasse des Zeicheneingabestroms
Writer: Abstrakte Klasse von Zeichenausgabestrom
Zwei Klassen im Zusammenhang mit Kodierungs- und Dekodierungsproblemen im Zeichenstrom:
InputStreamReader: Es ist eine Brücke vom Bytestrom zum Zeichenstrom: Es liest Bytes und verwendet einen angegebenen Zeichensatz, um ihn in Zeichen zu dekodieren. Der verwendete Zeichensatz kann namentlich angegeben, explizit angegeben werden oder den Standardzeichensatz der Plattform akzeptieren.
Konstruktormethode:
InputStreamReader(InputStream in)
Erstellen Sie einen InputStreamReader, der den Standardzeichensatz verwendet .
InputStreamReader(InputStream in, String charsetName)
Erstellt einen InputStreamReader, der einen benannten Zeichensatz verwendet.
|
OutputStreamWruter: Es ist eine Brücke vom Zeichenstrom zum Bytestrom: Es verwendet einen benutzerdefinierten Zeichensatz, um geschriebene Zeichen in Bytes zu kodieren. Der verwendete Zeichensatz kann namentlich angegeben oder explizit angegeben werden Standardzeichensatz der Plattform |
Konstruktionsmethode:
|
| OutputStreamWriter(OutputStream out)
Erstellen Sie einen OutputStreamWriter mit der Standardzeichenkodierung.
OutputStreamWriter(OutputStream out, String charsetName)
Erstellen Sie einen OutputStreamWriter, der einen benannten Zeichensatz verwendet.
| public class ConversionStreamDemo {
public static void main(String[] args) throws IOException {
//创建一个默认编码格式的InputStreamReader\OutputStreamWriter
InputStreamReader ipsr = new InputStreamReader(new FileInputStream("E:\\abc.txt"));
OutputStreamWriter opsw = new OutputStreamWriter(new FileOutputStream("E:\\abc.txt"));
//写入数据
opsw.write("你好啊");
opsw.close();
//读数据,方式一:一次读取一个字节数据
int ch;
while ((ch = ipsr.read()) != -1) {
System.out.print((char) ch);
}
ipsr.close();
}
}
四、字符流写数据的五种方法
方法名 |
说明 |
void write(int c) |
写一个字符 |
void write(char[] cbuf) |
写入一个字符数组 |
void write(char[] cbuf,int off,int len) |
写入字符数组的一部分 |
void write(String str) |
写入一个字符串 |
void write(String str,int off,int len) |
写入一个字符串的一部分 |
字符流写数据需要注意缓冲区的问题,如果想要将缓冲区的数据加载出来需要在写入方法后加上刷新方法flush();
前三个方法与字节流写入方法使用相同,这里重点介绍下面两种方式
public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
//创建一个默认编码格式的OutputStreamWriter对象
OutputStreamWriter opsw=new OutputStreamWriter(new FileOutputStream("E:\\abc.txt"));
//方式一:写入一个字节
opsw.write(97);
opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
//方式二:写入一个字符数组
char[]ch={'a','b','c','二'};
opsw.write(ch);
opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
//方式三:写入一个字符数组的一部分
opsw.write(ch,0,2);
opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
//方式四:写入一个字符串
opsw.write("一二三");
opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
//方式五:写入一个字符串的一部分
opsw.write("三四五",1,2);
opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
}
}
五、字符流读数据的两种方法
方法名 |
说明 |
int read() |
一次读取一个字符数据 |
int read(char[] cbuf) |
一次读取一个字符数组数据 |
public class InputStreamReadDemo {
public static void main(String[] args) throws IOException {
//创建一个默认编码格式的InputStreamReader
InputStreamReader ipsr=new InputStreamReader(new FileInputStream("E:\\abc.txt"));
//读取数据,方式一一次读取一个字符数据
int ch;
while ((ch=ipsr.read())!=-1){
System.out.print((char) ch);
}
ipsr.close();
//方式二:一次读取一个字符数组数据
char []ch=new char[1024];
int len;
while ((len=ipsr.read(ch))!=-1){
System.out.print(new String(ch,0,len));
}
ipsr.close();
}
}
小结:如果使用默认编码格式的话,那么字符输入流InputStreamReader可以使用子类FileReader来替代,字符输出流OutputStreamWriter可以使用其子类FileWriter来替代,两者在使用默认编码格式的情况下作用一致。
Das obige ist der detaillierte Inhalt vonBeispielanalyse eines Java-Zeichenstroms. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!