Müllcodeproblem in Java
Vor kurzem, bei Projekten, stoße ich oft auf Hava -Codeprobleme, also nahm ich mir die Zeit, um die verstümmelten Codeprobleme zu klären und mit ihnen umzugehen. Hier habe ich sie zusammengestellt.
analysieren
Codierung und Dekodierung
Codierung besteht darin, Zeichen in Bytes umzuwandeln, und das Dekodieren besteht darin, Bytes in Zeichen umzuwandeln.
Byte -Stream und Zeichenstrom
Lesen und Schreiben von Dateien werden alle über Byte -Streams implementiert. Auch wenn es in Java einen Zeichenstrom gibt, verwendet die zugrunde liegende Ebene den Byte -Stream.
Müllcode -Problem tritt auf
Die am häufigsten verwendeten Zeichen in Java sind Charaktere. Wenn wir die Datei in den Speicher lesen und in der Konsole (Byte Stream ---> Zeichenstrom) anzeigen, müssen wir Decodierung verwenden. Wenn die Datei die UTF-8-Codierung ist und wir sie bei der Dekodierung gegen GBK missbrauchen (wenn die Codierung nicht angegeben ist, übernimmt Java die Systemstudium-Codierung), um sie zu dekodieren, und kann nur verstümmeltes Code angezeigt werden. Wenn wir Dateien schreiben, geben Sie die Codierung (UTF-8) am besten an.
Lösung
Beispiel 1
Beim Konvertieren eines Byte -Streams in einen Zeichenstrom geben wir das Codierungsformat an. Dies ist unsere Datei sollte auch von GB2312 codiert werden
public static String read (String -Dateiname) löst eine Ausnahme aus {inputStream ist = new FileInputStream (Dateiname); BufferedReader in = neuer BufferedReader (neuer InputStreamReader (IS, "GB2312")); // Geben Sie das Codierungsformat an; StringBuilder sb = new StringBuilder (); while ((s = in.readline ())! = null) {sb.append (s + "/n"); } in.close (); return sb.tostring ();} Beispiel 2
Lesen Sie direkt über den Byte -Stream ein und geben Sie die Codierung an, wenn Sie sie mit Zeichenfolge in Zeichen konvertieren.
Paket com.dy.xidian; import java.io.fileinputStream; import Java.io.inputStream; Klasse BuferedInputFile {public static String read (String Dateiname) löst Ausnahme aus {@SuppressWarnings ("Ressource") InputStream ist = neuer Datei -Put -Stream (Filename); Byte [] B = neues Byte [1024]; is.read (b); Neue Zeichenfolge zurückgeben (b, "gb2312"); }} public class memoreinput {public static void main (String [] args) löst die Ausnahme aus {String Dateiname = "e: /html/gb2312.php"; String S = bufferedInputFile.read (Dateiname); System.out.println (s); }}fangen
Es gibt eine FileReader -Klasse in E/A -Operationen. Diese Klasse verbirgt die Details des Byte -Streaming in Zeichenströme, die wir auf diese Weise verwenden können. BufferedReader in = neuer BufferedReader (New FileReader (Dateiname)); Auf diese Weise erhalten wir direkt den Charakterstrom. Wir haben jedoch festgestellt, dass wir die Codierung nicht festgelegt haben, da die Standard -Codierungsmethode in FileReader angewendet wird. Dies wird sehr gefährlich. Wenn sich das Standard -Codierungsformat von der Codierung unserer Datei unterscheidet, müssen die Lesedaten verstümmelt werden. Daher sollten wir die Methode im Beispiel besser verwenden, um den Stream zu konvertieren.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!