Problema de código de basura en Java
Recientemente, cuando hago proyectos, a menudo me encuentro con problemas de código confuso en Java, por lo que me tomé el tiempo para resolver los problemas de código confuso y cómo lidiar con ellos. Aquí los he compilado.
analizar
Codificación y decodificación
La codificación es convertir personajes en bytes, y la decodificación es convertir bytes en caracteres.
Transmisión de bytes y transmisión de personajes
Lectura y escritura de archivos se implementan a través de transmisiones de bytes. Incluso si hay una corriente de personaje en Java, la capa subyacente todavía usa la corriente de byte.
Se produce un problema del código de basura
Los personajes más utilizados en Java son los personajes. Cuando leemos el archivo en la memoria y lo mostramos en la consola (transmisión de byte ---> transmisión de caracteres), necesitamos usar la decodificación. Si el archivo es la codificación UTF-8 y lo usamos mal a GBK al decodificar (si no se especifica la codificación, Java adoptará la codificación predeterminada del sistema) para decodificarlo, solo se puede mostrar código confuso. Cuando escribimos archivos, es mejor especificar la codificación (UTF-8).
Solución
Ejemplo 1
Al convertir una secuencia de bytes en una secuencia de caracteres, especificamos el formato de codificación. Este es nuestro archivo también debe ser codificado por GB2312
public static String Read (String FileName) lanza la excepción {InputStream IS = new FileInputStream (nombre de archivo); BufferedReader in = new BufferedReader (new InputStreamReader (IS, "GB2312")); // especificar las cadenas de formato de codificación s; StringBuilder sb = new StringBuilder (); while ((s = in.readline ())! = null) {sb.append (s + "/n"); } in.close (); return sb.ToString ();} Ejemplo 2
Lea directamente a través de la transmisión de bytes y especifique la codificación al convertirlo en caracteres usando String.
paquete com.dy.xidian; import java.io.fileInputStream; import java.io.inputstream; class BufferedInputFile {public static string read (String fileName) lanza la excepción {@suppressWarnings ("recurse") inputStream es = nuevo archivo FileStream (FileNameName); byte [] b = nuevo byte [1024]; IS.Read (b); devolver nueva cadena (b, "GB2312"); }} public class MemoryInput {public static void main (string [] args) lanza excepción {String filename = "e: /html/gb2312.php"; Cadena s = bufferedInputFile.read (nombre de archivo); System.out.println (s); }}trampa
Hay una clase de FileReader en operaciones de E/S. Esta clase oculta los detalles de la transmisión de bytes en transmisiones de caracteres, que podemos usar de esta manera. BufferedReader in = new BufferedReader (nuevo FileReader (nombre de archivo)); De esta manera, obtenemos directamente la transmisión del personaje. Pero descubrimos que no establecíamos la codificación, porque el método de codificación predeterminado se adopta en FileReader. Esto se vuelve muy peligroso. Si su formato de codificación predeterminado es diferente de la codificación de nuestro archivo, entonces los datos de lectura deben estar confusos. Por lo tanto, será mejor que usemos el método en el ejemplo para convertir la secuencia.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!