[Noções básicas de JAVA] Explicação detalhada de IO
Diretório de artigos
- [Noções básicas de JAVA] Explicação detalhada de IO
-
- I. Visão geral
- 2. O papel do fluxo IO
- 3. Cenários de uso do fluxo IO
- 4. Classificação de fluxos IO
- 5. Sistema de fluxo IO
- 6. Fluxo de entrada de bytes InputStream
- 7. Fluxo de saída de bytes OutputStream
- 8. Leitor de fluxo de entrada de caracteres
- 9. Escritor do processo de saída de caracteres
- 10. Resumo
I. Visão geral
Um fluxo é um conjunto sequenciado de bytes com um ponto inicial e um ponto final.É um termo geral ou abstração para transmissão de dados. A transmissão de dados entre dois dispositivos é chamada de fluxo. A essência de um fluxo é a transmissão de dados. O fluxo é abstraído em várias classes de acordo com as características de transmissão de dados para facilitar operações de dados mais intuitivas.
2. O papel do fluxo IO
Realize a transferência de dados entre dois dispositivos de objeto.
3. Cenários de uso do fluxo IO
- Quando usamos a classe File, só podemos realizar operações de arquivo, incluindo: obter atributos de arquivo, criar, excluir, mover arquivos, etc., mas não podemos fazer alterações no conteúdo do arquivo. Se quiser operar no conteúdo do arquivo, você precisa ler, excluir o conteúdo do arquivo, etc.
- Cenários de uso de fluxos IO: quando você precisa operar no conteúdo de um arquivo.
O objeto de operação do fluxo IO é um arquivo, em vez de ler e gravar uma pasta. Ao usar fluxos IO, tome cuidado para não estabelecer uma conexão com uma pasta.
4. Classificação de fluxos IO
Ele é dividido em diferentes fluxos de IO de acordo com diferentes padrões de classificação:
4.1 Pontos unitários para transmissão de dados:
- Fluxo de bytes: O que é transmitido são bytes e a unidade são bytes. A unidade mínima para leitura de um fluxo de bytes é um byte (1byte = 8 bits). Pode operar em qualquer tipo de dados.
- Fluxo de caracteres: O que é transmitido são bytes, e um caractere pode ser lido por vez (1char = 2byte = 16bit), a diferença é que a operação de codificação é adicionada durante o processo de transmissão, tornando nossa operação mais conveniente.
4.2 Direção de transmissão de dados:
- **Entrada de fluxo de entrada:** Ler dados externos (dados de dispositivos de armazenamento, como discos e discos ópticos) no programa (memória)
- **Saída de fluxo de saída:** Saída de dados do programa (memória) para dispositivos de armazenamento, como discos e discos ópticos
4.3 Diferentes funções do fluxo:
- Fluxo de nó: um fluxo que lê e grava dados diretamente de uma fonte (esse fluxo não é empacotado ou modificado).O fluxo de processamento é um fluxo baseado no encapsulamento do fluxo do nó. FileInputStream é um fluxo de nó que pode ler dados diretamente de um arquivo, mas BufferedInputStream pode agrupar FileInputStream para que ele tenha função de buffer.
- Fluxo de processamento: é usado para conectar e encapsular um fluxo de nó existente e realizar os recursos de leitura e gravação do fluxo por meio do fluxo encapsulado. Ao usar fluxos de processamento, o programa não se conecta diretamente à fonte de dados real, mas sim a um fluxo existente.
5. Sistema de fluxo IO
Classificação | Fluxo de entrada de bytes | Fluxo de saída de bytes | fluxo de entrada de caracteres | fluxo de saída de caracteres |
---|---|---|---|---|
classe base abstrata | Fluxo de entrada | Fluxo de saída | Leitor | Escritor |
acessar arquivos | FileInputStream | FileOutputStream | Leitor de arquivos | Escritor externo |
matriz de acesso | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
tubo de acesso | PipedInputStream | PipedOutputStream | Leitor canalizado | PipeWriter |
sequência de acesso | Leitor de entradaStream | OutputStreamWriter | ||
fluxo em buffer | BufferedInputStream | BufferedOutputStream | Leitor Buffered | BufferedWriter |
Fluxo de conversão | Leitor de entradaStream | SaídaSteamReader | ||
fluxo de objetos | ObjectInputStream | ObjectOutputStream | ||
FilterInputStream | FilterOutputStream | Leitor de Filtro | FiltroWriter | |
fluxo de impressão | ImprimirStream | Gravador de impressão | ||
Empurre o fluxo de entrada | PushbackInputStream | Leitor Pushback | ||
fluxo especial | DataInputStream | DataOutputStream |
6. Fluxo de entrada de bytes InputStream
InputStream é uma classe virtual, que é um fluxo de entrada de caracteres em Java, usado para ler dados de arquivos em programas Java.
O método mais comumente usado é: FileInputStream
-
Métodos comuns
- int read(): lê um byte de dados do arquivo. E retorne o byte lido. Se a leitura for concluída, o valor de retorno será -1;
- int read(byte[] b): Lê um array de bytes por vez. O fluxo de entrada colocará o conteúdo lido neste array de bytes e retornará o número de leitura. Se a leitura for concluída, -1 será retornado. ;
- void close(); fecha o fluxo de bytes;
-
Etapas de implementação de FileInputStream
- Crie um objeto de fluxo FileInputStream e vincule um arquivo de fonte de dados
- Chame o método read para ler dados
- Liberar recursos
-
Código de amostra
public void inputStreamMethod() throws Exception { FileInputStream in=new FileInputStream("D:\\goyeer.txt"); //创建Fileinptstream 流对象,并绑定源文件 byte[] buf=new byte[1024]; int len; //调用read方法读取数据 while((len=in.read(buf))!= -1){ String line=new String(buf,0,len,"UTF-8"); System.out.println(line); } }
-
Sistema InputStream
7. Fluxo de saída de bytes OutputStream
A classe OutputStream é a classe base para todos os fluxos de saída na API Java IO. As subclasses incluem BufferedOutputStream, FileOutputStream, etc. OutputStream é um modo de decoração típico, que pode ser subclassificado diretamente quando usado. OutputStream pode enviar para console, arquivos, discos e outras mídias de destino.
-
Métodos comuns
- void close(); Fecha o fluxo de saída para evitar que os recursos sejam muito ocupados, o que pode eventualmente levar ao estouro de manipulação ou de memória.
- void write(int b); o único método abstrato em uma classe abstrata. Subclasses não abstratas devem implementar este método.
- void write(byte b[]) gera diretamente todo o conteúdo de uma matriz de bytes.
- void write(byte b[], int off, int len) O conteúdo a ser gerado foi armazenado na matriz de bytes b[], mas nem todo ele é gerado. Somente len bytes começando na posição off da matriz são saída.
- void exuberante() libera o fluxo de saída e gera todos os bytes em buffer. Como alguns fluxos suportam cache, esse método forçará a saída de todo o conteúdo do cache para o fluxo.
-
Etapas de implementação do OutputStream
- Crie um objeto de fluxo OutputStream
- escrever entrada do método
- close fecha o fluxo para evitar estouro de memória
-
Código de amostra
public void outputStreamMethod() throws IOException{ OutputStream ou=new FileOutputStream("D:\\ShowCoding.txt"); String str = "欢迎Goyeer社区"; byte[] bytes = str.getBytes(); for(int i = 0; i < bytes.length; i++) { ou.write(bytes[i]); } ou.close(); }
-
Sistema OutputStream
8. Leitor de fluxo de entrada de caracteres
Reader é a classe pai do fluxo de caracteres de entrada. É uma classe abstrata e não é recomendada para leitura e gravação de arquivos.
-
Métodos comuns
- void close(); Fecha o stream e libera todos os recursos associados a ele;
- void mark(int readAheadLimit); marca a posição atual no stream;
- boolean markSupported(); determina se este fluxo suporta a operação mark();
- int read(); lê um único caractere;
- int read(char[] cbuf); Ler caracteres no array;
- int read(char[] cbuf, int off, int len); Lê caracteres em uma determinada parte do array;
- int read(CharBuffer target) ;Tenta ler caracteres no buffer de caracteres especificado
- boolean ready() ; Determine se este fluxo está pronto para ser lido;
- void reset();Redefinir o fluxo
- salto longo(n longo); pular caracteres
-
Etapas de implementação do leitor
- Cria um objeto de fluxo de leitura de arquivo associado ao arquivo com o nome especificado; é garantido que o arquivo exista. Quando o arquivo não existe, ocorre uma exceção (FileNotFoundException);
- Chame o método read do objeto de fluxo de leitura para ler um caractere por vez e ler automaticamente os caracteres subsequentes;
- Chame o método para fechar o fluxo de caracteres;
-
Código de amostra
public static void readerMethod() throws IOException{ Reader reader=new FileReader("D:\\goyeer.txt"); int ch = 0; char [] buf= new char[1024]; while((ch=reader.read(buf))!=-1){ System.out.print(new String(buf,0,ch)); } reader.close(); }
-
Sistema leitor
9. Escritor do processo de saída de caracteres
A classe Writer é a classe base de todos os Writers em Java IO. É uma classe abstrata localizada no pacote java.io. Implemente subclasses que implementam o Writer, incluindo BufferedWriter e PrintWriter.
-
Métodos comuns
- Writerappend(char c) adiciona o caractere especificado a esta gravação
- Writerappend(CharSequence csq) adiciona a sequência de caracteres especificada a este escritor
- Writerappend(CharSequence csq, int start, int end) adiciona uma subsequência da sequência de caracteres especificada a este escritor.Appendable
- abstract void close() fecha este fluxo, mas libera-o primeiro
- abstract void flush() atualiza o buffer deste fluxo
- void write(char[] cbuf) escreve array de caracteres
- abstract void write(char[] cbuf, int off, int len) grava uma determinada parte do array de caracteres
- void write(int c) escreve um único caractere
- void write(String str) escreve string
- void write(String str, int off, int len) escreve uma determinada parte da string
-
Etapas de implementação do escritor
- Instanciar o Writer via subclasse
- Implementar operações de gravação de arquivos por meio do método write
- close fecha o fluxo de saída e libera recursos.
-
Código de amostra
public static void writeMethod() throws IOException { Writer out = new FileWriter("D:\\goyeer.log"); String str = "I/O字符流,Writer类应用。"; out.write(str); out.close(); }
-
Sistema escritor
10. Resumo
Java IO é o sistema de entrada e saída Java, ou seja, entrada e saída, que se refere à transferência de dados entre aplicativos e dispositivos externos.Dispositivos externos comuns incluem arquivos, canais e conexões de rede. Ao escrever um programa, escolha o fluxo de bytes e o fluxo de caracteres adequados ao seu cenário e use subclasses abstratas de maneira flexível.