Was soll ich tun, wenn Java io verstümmelt ist? IO- und Chinesisch-verstümmelte Probleme in Java
Dies ist das erste Mal, dass ich einen Blog dieser Art veröffentliche, daher hatte ich Schwierigkeiten, wie ich anfangen soll, also könnte ich genauso gut direkt zum Thema gehen und etwas aufzeichnen Beginnen wir mit den einfachen Erfahrungen. Ich habe gerade mit dem Lernen begonnen und hoffe, dass ich mich in Zukunft langsam daran halten und bessere und aussagekräftigere Inhalte schreiben kann.
Tatsächlich stoßen wir bei der Arbeit nicht auf viele Probleme mit verstümmelten chinesischen Zeichen. Das liegt daran, dass das Unternehmen zur Vereinfachung der Entwicklung eine einheitliche Kodierung von Dateien verwendet hat. Aber ich denke, es ist notwendig, ein wenig über seine Prinzipien zu verstehen.
Empfehlung: „Java-Lernen“
IO ist der Input- und Output-Stream, objektorientiert verstanden ist es der Input und Ausgabestream-Objekte werden hauptsächlich zum Betreiben von Dateiobjekten verwendet. Lassen Sie uns also ein wenig über das Konzept von Dateien, also Dateiobjekten, sprechen. In Java ist File keine bestimmte Datei, auf die wir im täglichen Leben verweisen, sondern ein Pfadobjekt, zum Beispiel File file=new File("D:\aaa"); Dies ist ein File-Objekt, möglicherweise stellt es For a dar Ordner existiert der Pfad möglicherweise nicht, aber dieser Code erstellt tatsächlich ein File-Objekt, das den Pfad darstellt. Diese Schreibweise wird einfach nicht häufig verwendet. Weil wir normalerweise mehr mit einem Text, einem Bild usw. arbeiten, wie zum Beispiel File f=new File("aaa.txt");
Oben wurde kurz erwähnt, was IO und File sind, und wir werden darüber sprechen Sprechen Sie als Nächstes darüber, wie diese Bilder, Texte, Videos und andere Informationen auf unseren Speichergeräten gespeichert werden.
Mein persönliches Verständnis ist, dass die Datei, egal um welchen Typ es sich handelt, in binärer Form gespeichert wird. Die Mindesteinheit beträgt 1 Byte, bestehend aus 8 Bits 01. Wenn wir also eine Datei kopieren möchten, müssen wir nur den Byte-Stream bearbeiten, das heißt, alle Bytes in einer Datei abrufen und in eine andere Datei schreiben. Tatsächlich ist dies theoretisch möglich, aber für Zeichendateien dieses Typs sind etwas ganz Besonderes.
Aus diesem Grund gibt es ein Problem mit verstümmelten chinesischen Schriftzeichen. Jeder kennt die ASCII-Codetabelle oder hat zumindest davon gehört. Sie sollte als eine Codetabelle betrachtet werden, die zunächst nur zur Darstellung von 26 englischen Buchstaben und einigen Sonderzeichen verwendet wurde (da Computer sie nur erkennen). binär, daher ist es notwendig, Zeichen durch entsprechende Bytes zu ersetzen, um eine Codetabelle zu bilden.
Aber mit der Entwicklung von Computern reicht ASCII möglicherweise nicht mehr aus und viele Länder verfügen möglicherweise über eigene Kodierungsschemata, sodass unterschiedliche Kodierungstabellen entstanden sind. Üblich sind GBK und UTF-8, und die in JVM verwendete Standardcodierung ist die Unicode-Codierung, dh 2 Bytes stellen ein chinesisches Zeichen dar, UTF-8 ist jedoch nicht unbedingt der Fall. Es können 3 Bytes sein, um ein chinesisches Zeichen darzustellen , oder mehr. Es entsteht also ein Problem: Die Anzahl und der Inhalt der entsprechenden Bytecodes für dasselbe chinesische Zeichen in verschiedenen Codetabellen sind unterschiedlich.
Wie kann man das Problem lösen?
Wenn wir ein Bild von Datenträger A auf Datenträger B kopieren, müssen wir nur alle Bytes von A auf B übertragen. Es ist aber tatsächlich möglich, einen Text auf die gleiche Weise zu bedienen, vorausgesetzt, dass die Textkodierungen in A und B gleich sein müssen. Weil es in Bildern kein Problem mit der Bytekodierung gibt. Aber was soll ich tun, wenn ich Chinesisch vom Netzwerk oder Server übertragen möchte? Dies kann sicherlich nicht nur durch Bytes erreicht werden (da wir die Kodierung der Datei nicht manuell ändern können, wenn wir auf Probleme stoßen). Daher stellt Java ein Zeichenstromobjekt bereit, das Codierungseinstellungen basierend auf dem Bytestrom hinzufügt, um das Problem verstümmelter Zeichen zu lösen.
Lassen Sie uns ohne weitere Umschweife ein paar kleine Fälle zur Veranschaulichung verwenden:
Erstellen Sie zunächst aa.txt und bb.txt unter dem aktuellen Projekt. Schreiben Sie einfach ein paar chinesische Schriftzeichen in aa. Sie werden feststellen, dass beide Methoden
a erreichen können, indem Sie den Zeichenstrom
FileReader fr=new FileReader("aa.txt"); FileWriter fw=new FileWriter("bb.txt"); int c; while((c=fr.read())!=-1){ fw.write(c); } fr.close(); fw.close();
b und den Bytestrom
FileInputStream fis=new FileInputStream("aa.txt"); FileOutputStream fos=new FileOutputStream("bb.txt"); int b; while((b=fis.read())!=-1){ fos.write(b); } fis.close(); fos.close();
2 verwenden Methode von aa ist Wenn es UTF-8 ist, ändern wir die Kodierung von bb in GBK und prüfen, ob wir die beiden oben genannten Methoden erneut ausführen. Alle Zeichen sind verstümmelt.
Der Grund dafür ist, dass die chinesische Codetabelle aufgrund der unterschiedlichen Codierungsmethoden der beiden Dateien unterschiedlich ist und der Code daher verstümmelt ist.
3. Wenn also die Codierungsmethoden der beiden Dateien unterschiedlich sind, können wir beim Lesen und Schreiben die der Datei entsprechende Codierung angeben.
Die Implementierung ist wie folgt:
InputStreamReader isr=new InputStreamReader(new FileInputStream("aa.txt"),"utf-8"); OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("bb.txt"),"gbk"); char[] arr=new char[1024]; int len; while((len=isr.read(arr))!=-1){ String s=new String(arr,0,len); System.out.println(s); osw.write(s); } isr.close(); osw.close();
Obwohl der Code sehr einfach ist, erklären wir ihn kurz. Anhand der API können wir feststellen, dass InputStreamReader und OutputStreamWriter beide Objekte sind, die mit Zeichen arbeiten. Fahren Sie mit Reader und Writer fort.
wird hauptsächlich verwendet, um Bytes in Zeichen und Zeichen in Bytes umzuwandeln. Aus der Konstruktion lässt sich also auch ableiten, dass es sich bei der Übergabe um ein Bytestream-Objekt handelt. Verwenden Sie UTF-8, um den Byte-Stream zu lesen und in Zeichen umzuwandeln. Anschließend konvertieren Sie die Zeichen in GBK-Codierung und schreiben sie in Bytes.
Die folgenden Zeilen werden nicht erklärt, es sind alles grundlegende Methoden. Was bei der Konstruktion übergeben wird, ist das anonyme innere Klassenobjekt und das dekorative Designmuster. Sie können diese Schreibmethode einfach verstehen.
Es gibt tatsächlich viele nützliche Klassen für Byte- und Zeichenströme, wie zum Beispiel BufferedInputStream, BufferedReader usw., auf die ich nicht noch einmal näher eingehen werde.
Was die Codierungsprobleme von JVM und Systemplattform betrifft, werde ich sie hier nicht erläutern.
Sie können es mit String versuchen und die Bytecode- und Codierungsprobleme des Strings während der Kompilierung und Laufzeit beobachten.
Das obige ist der detaillierte Inhalt vonWas tun, wenn Java Io verstümmelt ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!