Este artigo analisa a diferença entre fluxos de caracteres e fluxos de bytes em Java para sua referência. O conteúdo específico é o seguinte
1. O que é fluxo
O fluxo em Java é uma abstração de sequências de bytes. Podemos imaginar que há um tubo de água, mas agora não está mais fluindo água no tubo de água, mas uma sequência de bytes. Como os fluxos de água, os riachos em Java também têm uma "direção do fluxo". Um objeto do qual uma sequência de bytes pode ser lida é chamada de fluxo de entrada; Um objeto ao qual uma sequência de bytes é escrito é chamado de fluxo de saída.
2. BYTE Stream
A unidade mais básica de processamento de fluxo de bytes em Java é um byte único, que geralmente é usado para processar dados binários. As duas classes mais básicas de fluxo de bytes em Java são InputStream e OutputStream, que representam o grupo de fluxos básicos de bytes de entrada e fluxos de bytes de saída, respectivamente. Tanto a classe InputStream quanto a classe de saída de saída são classes abstratas. No uso real, geralmente usamos uma série de subclasses deles fornecidos na biblioteca da classe Java. Vamos pegar a classe InputStream como exemplo para introduzir o fluxo de bytes em Java.
A classe InputStream define um método básico lido para leitura de bytes de um fluxo de bytes. A definição desse método é a seguinte:
Public Abstract Int Read () lança IoException;
Este é um método abstrato, ou seja, qualquer classe de fluxo de bytes de entrada derivada do InputStream precisa implementar esse método. A função desse método é ler um byte do fluxo de bytes e retornar -1 se chegar ao fim, retornar o byte de leitura. O que precisamos observar sobre esse método é que ele continuará bloqueando e retornando um byte de leitura ou -1. Além disso, os fluxos de bytes não suportam o armazenamento em cache por padrão, o que significa que toda vez que o método de leitura é chamado, o sistema operacional solicitará que o sistema operacional leia um byte, que geralmente é acompanhado pelo disco IO, para que seja relativamente ineficiente. Alguns amigos podem pensar que o método sobrecarregado de leitura na classe InputStream com a matriz de bytes, pois os parâmetros podem ler vários bytes por vez, sem o disco frequente IO. Então esse é o caso? Vamos dar uma olhada no código -fonte deste método:
public int read (byte b []) lança ioexception {return read (b, 0, b.length);}Ele chama outra versão do método de sobrecarga de leitura, por isso continuaremos a seguir:
public int read (byte b [], int off, int len) lança ioexception {if (b == null) {lança new nullPointerException (); } else if (off <0 || len <0 || len> b.Length - Off) {lança novo indexOutOfBoundSexception (); } else if (len == 0) {return 0; } int c = read (); if (c == -1) {return -1; } b [off] = (byte) c; int i = 1; tente {for (; i <len; i ++) {c = read (); if (c == -1) {break; } b [off + i] = (byte) c; }} catch (ioexception ee) {} return i; }A partir do código acima, podemos ver que, de fato, o método de leitura (byte []) também usa um loop para chamar o método read () para ler em uma matriz de bytes "ao mesmo tempo", portanto esse método não usa um buffer de memória. Para usar buffers de memória para melhorar a eficiência da leitura, devemos usar o BufferInputStream.
3. Fluxo de caracteres
A unidade mais básica de processamento de fluxos de caracteres em Java é o símbolo Unicode (2 bytes de tamanho), que geralmente é usado para processar dados de texto. O chamado símbolo Unicode é uma unidade de código Unicode com um intervalo de 0x0000 ~ 0xffff. Cada número no intervalo acima corresponde a um caractere. O tipo de string em Java codifica caracteres nas regras Unicode por padrão e os armazena na memória. No entanto, diferentemente do armazenamento na memória, os dados armazenados no disco geralmente possuem vários métodos de codificação. Usando diferentes métodos de codificação, os mesmos caracteres terão diferentes representações binárias. Na verdade, os fluxos de personagens funcionam assim:
Fluxo de caracteres de saída: converta a sequência do caractere (na verdade, uma sequência de símbolos unicode) na sequência de bytes no método de codificação especificado e, em seguida, escreva -o no arquivo;
Fluxo de caracteres de entrada: decodifique a sequência de bytes a ser lida na sequência de caracteres correspondente (na verdade, a sequência do símbolo Unicode) no método de codificação especificado para que possa ser armazenado na memória.
Usamos uma demonstração para aprofundar nossa compreensão desse processo. O código de amostra é o seguinte:
importar java.io.fileWriter; importar java.io.ioException; public class FileWriterDemo {public static void main (string [] args) {fileWriter fileWriter = null; tente {tente {fileWriter = new FileWriter ("Demo.txt"); fileWriter.Write ("Demo"); } finalmente {fileWriter.close (); }} catch (ioexception e) {e.printStackTrace (); }}}No código acima, usamos o FileWriter para gravar os quatro caracteres "Demo" no Demo.txt. Utilizamos o editor hexadecimal Winex para ver o conteúdo do Demo.txt:
Como pode ser visto na figura acima, a "demonstração" que escrevemos é codificada como "64 65 6d 6f", mas não especificamos explicitamente o método de codificação no código acima. De fato, quando não especificamos, o método de codificação de caracteres padrão do sistema operacional é usado para codificar os caracteres que queremos escrever.
Como o fluxo de caracteres realmente precisa concluir a conversão da sequência de símbolos Unicode para o método de codificação correspondente antes da saída, ele usará um buffer de memória para armazenar a sequência de bytes convertida e aguardar a conclusão da conversão antes de escrever no arquivo de disco juntos.
4. A diferença entre o fluxo de caracteres e o fluxo de bytes
Após a descrição acima, podemos saber que as principais diferenças entre fluxos de bytes e fluxos de caracteres são refletidos nos seguintes aspectos:
A unidade básica da operação de fluxo de bytes é bytes; A unidade básica de operação do fluxo de caracteres é os símbolos Unicode.
Por padrão, o fluxo de bytes não usa buffers; O fluxo de caracteres usa buffers.
Um fluxo de bytes é geralmente usado para processar dados binários. De fato, ele pode processar qualquer tipo de dados, mas não suporta a escrita ou a leitura de símbolos Unicode diretamente; Um fluxo de caracteres geralmente processa dados de texto, que suportam símbolos de escrita e leitura Unicode.
O exposto acima são alguns dos meus entendimentos dos fluxos de personagem e fluxos de bytes em Java. Se houver descrições pouco claras ou imprecisas, espero que você possa corrigi -las. Obrigado.