Problema de código de lixo em java
Recentemente, ao realizar projetos, muitas vezes encontro problemas de código iluminados em Java, então dediquei um tempo para resolver os problemas de código iluminados e como lidar com eles. Aqui eu os compilei.
analisar
Codificação e decodificação
A codificação é converter caracteres em bytes, e a decodificação é converter bytes em caracteres.
Fluxo de bytes e fluxo de personagens
Todos os arquivos de leitura e gravação são implementados por meio de fluxos de bytes. Mesmo se houver um fluxo de caracteres em Java, a camada subjacente ainda usa o fluxo de bytes.
O problema do código de lixo ocorre
Os caracteres mais usados em Java são caracteres. Quando lemos o arquivo na memória e o exibimos no console (fluxo de bytes ---> Stream de caracteres), precisamos usar a decodificação. Se o arquivo estiver codificando UTF-8 e nós o usamos mal ao GBK ao decodificar (se a codificação não for especificada, o Java adotará a codificação padrão do sistema) para decodificá-lo, apenas o código ilegal poderá ser exibido. Quando escrevemos arquivos, é melhor especificar a codificação (UTF-8).
Solução
Exemplo 1
Ao converter um fluxo de bytes em um fluxo de caracteres, especificamos o formato de codificação. Este é o nosso arquivo também deve ser codificado por GB2312
public static string read (string filename) lança a exceção {inputStream is = new FileInputStream (nome do arquivo); BufferredReader in = new BufferredReader (novo InputStreamReader (IS, "GB2312")); // Especifique a sequência de formato de codificação S; Stringbuilder sb = new stringbuilder (); while ((s = in.readline ())! = null) {sb.append (s + "/n"); } in.close (); Retorne sb.toString ();} Exemplo 2
Leia diretamente através do fluxo de bytes e especifique a codificação ao convertê -lo em caracteres usando a String.
pacote com.dy.xidian; importar java.io.fileInputStream; importar java.io.inputStream; classe bufferInputfile {public static string leia (string filename) lança exceção {@suppresswarnings ("recurso") inputStream is = new FileInputStream (filename); byte [] b = novo byte [1024]; is.read (b); return New String (B, "GB2312"); }} classe pública MemoryInput {public static void main (string [] args) lança exceção {string filename = "e: /html/gb2312.php"; String s = bufferingInputFile.read (nome do arquivo); System.out.println (s); }}armadilha
Existe uma classe FileReader nas operações de E/S. Essa classe esconde os detalhes do streaming de bytes em fluxos de caracteres, que podemos usar dessa maneira. BufferredReader in = new BufferredReader (new FileReader (nome do arquivo)); Dessa forma, obtemos diretamente o fluxo de personagens. Mas descobrimos que não definimos a codificação, porque o método de codificação padrão é adotado no FileReader. Isso se torna muito perigoso. Se o formato de codificação padrão for diferente da codificação do nosso arquivo, os dados de leitura deverão ser iluminados. Então, é melhor usar o método no exemplo para converter o fluxo.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!