As funções de entrada e saída da linguagem Java são muito poderosas e flexíveis. A única desvantagem é que os códigos de entrada e saída parecem muito concisos, porque você geralmente precisa envolver muitos objetos diferentes. Na biblioteca de classes Java, o conteúdo da parte de IO é muito grande porque envolve uma ampla gama de campos: entrada e saída padrão, operação de arquivo, fluxos de dados na rede, fluxos de string, fluxos de objetos, fluxos de arquivos zip ... O objetivo deste artigo é introduzir uma explicação detalhada da entrada e exemplos de fluxos de saída em Java.
A hierarquia dos fluxos
definição:
O Java lerá o objeto de dados em um fluxo de entrada, e o objeto ao qual ele pode ser escrito é chamado de fluxo de saída. O diagrama de estrutura é o seguinte:
1. Entrada e saída:
Entrada/saída refere -se à entrada ou saída de dados para um determinado dispositivo ou ambiente. Qualquer idioma tem a função de entrada e saída. Em um programa Java, a entrada e a saída são concluídas por meio de fluxos. Está conectado a dispositivos físicos através de um sistema de entrada e saída Java. Embora os dispositivos físicos reais conectados aos fluxos de entrada e saída sejam diferentes, eles podem funcionar da mesma maneira. Por exemplo, para a entrada e saída do disco rígido, a entrada e saída do host de rede, portanto, haverá vários problemas e soluções de entrada e saída para diferentes dispositivos ou ambientes.
2. Stream:
Um fluxo refere -se a uma sequência de dados que se movem entre a entrada e a saída de um computador. Os dados na sequência do fluxo podem ser dados binários brutos que não foram processados ou dados específicos que atendem aos requisitos de um determinado formato após um determinado processo de codificação. É habitual chamar a peça relacionada ao código interno e a peça independente do código externo.
A partir do método de transmissão de dados, o fluxo pode ser dividido no fluxo de entrada e fluxo de saída; A partir do conteúdo do fluxo, o fluxo pode ser dividido em fluxo de bytes e fluxo de caracteres.
(1) fluxo de entrada e saída
A função do fluxo de entrada é ler dados de dentro do programa para o exterior.
A função do fluxo de saída é escrever dados de fora do programa para dentro.
(2) fluxo de bytes e fluxo de caracteres
Um fluxo de bytes pode ler e gravar dados em unidades de bytes, que podem ler e escrever dados de um byte após o outro, ou ler e escrever blocos de bytes de qualquer comprimento por vez (ou seja, matrizes de byte).
Os fluxos de caracteres são usados em caracteres ao ler e escrever dados em fluxos, um caractere de cada vez ou um bloco de caracteres por vez.
Para facilitar o processamento do fluxo, os fluxos no idioma Java são encapsulados no pacote java.io; portanto, para usar fluxos, você deve importar o pacote java.io.
O fluxo de E/S de Java é baseado em quatro classes abstratas, a saber, InputStream, OutputStream, Reader e Writer. A classe InputStream e sua subclasse podem ser usados para implementar o processamento de entrada de dados de fluxo de bytes; A classe de saída de saída e sua subclasse podem ser usados para implementar o processamento de saída de dados de fluxo de bytes; A classe do leitor e sua subclasse podem ser usados para implementar o processamento de entrada dos dados do fluxo de caracteres; A classe do escritor e sua subclasse podem ser usados para implementar o processamento de saída dos dados do fluxo de caracteres.
1. Classe de arquivo
A leitura e a gravação de arquivos no Java pode ser implementada por meio de fluxos de entrada e saída, mas o Java fornece uma classe de arquivo especial para implementá -lo para diretórios de arquivos, propriedades e informações de gerenciamento.
(1) O construtor da classe de arquivo
Os construtores para criar um objeto de classe de arquivo são:
Arquivo (string pathname); // Crie com base no nome do caminho.
Arquivo (arquivo pai, string filho); // Crie sob o objeto de arquivo fornecido.
Arquivo (string pai, String Child); // Crie com base no caminho especificado.
Arquivo (URL URL); // Crie com base em um link URL.
(2) Métodos comuns da classe de arquivo
Boolean CanRead (): determina se o caminho correspondente ao objeto de arquivo é legível.
boolean canwrite (): determina se o caminho correspondente ao objeto de arquivo é gravável.
existe boolean (): determina se o caminho correspondente ao objeto de arquivo existe.
String getAbsolutepath (): obtém o caminho absoluto do caminho correspondente do objeto de arquivo.
String getParent (): obtém o diretório do caminho correspondente do objeto de arquivo.
String getPath (): recebe o caminho correspondente ao objeto de arquivo.
boolean isabsolute (): determina se o caminho correspondente ao objeto de arquivo é um caminho absoluto.
String getName (): recebe o nome do arquivo do caminho correspondente do objeto de arquivo.
boolean isDirectory (): determina se o caminho correspondente ao objeto de arquivo é um diretório.
boolean isfile (): determina se o caminho correspondente ao objeto de arquivo é um arquivo.
boolean ishidden (): determina se o arquivo correspondente ao objeto de arquivo é um atributo oculto.
comprimento longo (): obtenha o comprimento do arquivo correspondente ao objeto de arquivo.
LastModified (): obtenha o tempo de modificação mais recente do arquivo correspondente ao objeto de arquivo.
boolean renameto (arquivo de arquivo): altere o nome do arquivo do arquivo correspondente ao objeto de arquivo.
boolean setReadonly (): defina o arquivo correspondente do objeto de arquivo como somente leitura.
(3) Crie um arquivo
Crie um novo arquivo criando um fluxo de saída de arquivo. Esse método não pode criar um diretório e, se o arquivo que você deseja criar já existir, um novo arquivo será criado para substituir o arquivo original.
FileouTrputStream File = new FileOutputStream ("nome do arquivo"); (4) Obtenha uma lista de arquivos
Obtenha uma lista de arquivos de uma determinada pasta através do método List () ou ListFiles () da classe de arquivo. Existem várias formas:
String [] lista ();
Arquivo [] listfiles ();
Arquivo [] listfiles (filtro filenameFilter);
Arquivo [] listfiles (filtro FileFilter);
Entre eles, o FileFilter e o FileNameFilter são ambas as interfaces, e o filtro é o filtro correspondente. Declare uma determinada classe e implemente a interface do filtro, para que todos os arquivos correspondentes possam ser listados através de condições de filtragem.
2. Classe InputStream e classe de saída
A classe de fluxo de bytes é uma série de classes derivadas das classes abstratas InputStream e OutputStream. Esse tipo de fluxo é baseado em bytes. As classes InputStream e OutputStream podem ser usadas para processar dados de arquivos binários, mas também para processar arquivos de texto.
1. Métodos comuns da classe InputStream
A classe InputStream é a classe pai de todos os fluxos de entrada. Todos os métodos desta classe lançarão uma ioexception quando ocorrer um erro. Os principais métodos são:
(1) Public Abstract Int Read () aqueles ioexception
O método retorna um número inteiro entre 0 e 255 ou -1 e -1 significa que o final do fluxo foi encontrado e outros bytes correspondentes lidos.
(2) public int leia (byte [] b) aquelas ioexception
O método lê bytes na matriz de bytes fornecida pelo parâmetro, e o valor de retorno é o número de bytes realmente lidos em ou -1 (o final do fluxo é encontrado).
(3) public int leia (byte [] b, int i, int b) aquelas ioexception
Os dois últimos parâmetros do método fornecem a posição inicial da leitura e o número máximo de bytes lidos, respectivamente.
(4) public int disponível ()
Retorna o número de bytes que não foram lidos no objeto de fluxo atual. Ou seja, obtenha o comprimento dos dados no fluxo.
(5) Skip Long Public Long (Long N)
Skip n bytes no objeto de fluxo atual, e o número real de bytes ignorados é retornado como um valor de retorno.
(6) Public Boolean Marksupportd ()
Determine se o fluxo suporta marcas e as marcas podem retornar facilmente à posição de leitura original.
(7) Public Void Close ()
Feche o objeto de fluxo atual e libere os recursos ocupados pelo objeto Stream.
(8) Public Void Mark (int i)
Defina um sinalizador para a posição atual no fluxo para que você possa continuar lendo essa posição posteriormente.
(9) Redefinição do vazio público ()
Retorne a posição da leitura do fluxo para a posição da marca definida.
2. Métodos comuns de classe de saída
A classe de saída de saída é a classe pai de todos os fluxos de saída. Todos os métodos desta classe retornam vazios e lançam uma ioexception em um caso de erro. Os principais métodos são:
(1) Public Void Write (int b) lança IoException
Escreva um byte de dados no final do fluxo.
(2) gravação pública void (byte [] b) lança a ioexception
Escreva os dados na matriz B no objeto de fluxo atual, por sua vez.
(3) fio vazio público (byte [] b, int i, int n)
Escreva dados dos comprimentos subsequentes na matriz no objeto Stream em sequência desde o início (incluído).
(4) Public Void Close ()
Feche o objeto de fluxo atual e libere os recursos ocupados pelo objeto Stream.
(5) Public Void Flush ()
Força Saída dos dados em buffer no objeto de fluxo atual. Use este método para obter saída imediata.
A maioria dos métodos das duas classes acima é substituída pelas subclasses dos métodos InputStream e OputStream, exceto para os métodos Mark () e Reset ().
3. Classe FileInputStream
A classe FileInputStream é uma subclasse do InputStream, que pode ser usada para processar fluxos de dados que usam arquivos como fontes de entrada de dados para implementar operações de leitura de arquivos.
Seus métodos de construção são:
(1) FileInputStream (arquivo f)
Crie um fluxo de entrada de arquivo com o objeto de arquivo f com o nome especificado como a fonte de dados.
Se f existir, deve ser um caminho de arquivo. Se for um diretório, uma ioexception será lançada, mas se esse diretório não existir, ele será jogado: FILENOTFoundException será lançado.
(2) FileInputStream (nome da string)
Crie um fluxo de entrada de arquivo com um arquivo nomeado como fonte de dados.
(3) FileInputStream (FileDescriptor F)
Crie um fluxo de entrada de arquivo para a extremidade de entrada com base no objeto do descritor de arquivo f.
Seu principal método é substituir os métodos da classe pai (classe InputStream): read (), read (byte [] b), read (byte [] b, int i, int length), skip (long n), disponível (), feche ().
4. Classe FileOutputStream
A classe FileOutputStream é uma subclasse do OutputStream, usada para processar fluxos de dados em saída por arquivos como dados e implementar operações de gravação em arquivos. Seus métodos de construção são:
FileOutputStream (arquivo f);
FileOutputStream (arquivo F, booleano B);
FileOutputStream (string f);
Seus principais métodos incluem métodos que cobrem a classe pai: Write (int b), Write (BYTE [] B), WRITE (BYTE [] B, INT OFF, INT LEN), CHEFER () e FLANCE ().
5. Classes de DatainputStream e DataOutputStream
Os objetos criados pelas classes DateInputStream e DataOutputStream são chamados de fluxos de entrada de dados e fluxos de saída de dados, respectivamente. Eles implementam a interface do DataAinput e a interface DataOutput, respectivamente. A classe DateInputStream e o objeto DataOutputStream permitem a leitura de vários tipos de dados Java.
Esses dois fluxos pertencem a fluxos de filtragem e outros fluxos, como o InputStream ou o OutputStream, são frequentemente usados como entrada ou saída. Por exemplo:
FileInputStream fis = new FileInputStream ("d: //a.txt");
DatainputStream DIS = new DatainputStream (FIS);
FileOutputStream fos = new FileOutputStream ("d: //a.txt");
DataOutputStream DOS = new DataOutputStream (FOS);
A entrada e saída de DateInputStream e DataOutputStream são quase correspondentes. Os métodos de leitura e escrita de cada tipo de dados básicos podem ser identificados a partir do nome do sufixo. Por exemplo:
readint (), writeInt () // Leia e escreva um valor int
readboolean (), writeBoolean () // Leia e escreva um valor booleano
readchar (), writechar () // leia e escreva um personagem
readDouble (), Writedouble () // Leia e escreva um valor de ponto flutuante de precisão dupla
readfloat (), writefloat () // leia e escreva um valor de ponto flutuante de precisão única
WriteChars () // escreva uma string, mas não há como ler a string diretamente
3. Classe de leitor e aula de escritor
Os caracteres em Java usam a codificação Unicode, cada caractere tem dois bytes, ou seja, 16 bits. Os fluxos de caracteres são baseados em caracteres representados pelos códigos Unicode de 16 bits e de leitura e gravação de dados de texto, que podem realizar a conversão entre formatos internos em programas Java e formatos externos, como arquivos de texto, exibição de saídas, entradas de teclado etc. Esse método é especialmente adequado para a operação de caracteres chineses. Se os caracteres chineses operam em bytes, é possível produzir código ilegal.
O leitor e o escritor são classes pais abstratas de todos os fluxos de caracteres no pacote java.io, definindo métodos -chave para implementar outras classes de fluxo. Os dois mais importantes são read () e write (), que leem e escrevem dados de caracteres, respectivamente. Os métodos das classes de leitor e escritor e suas subclasses são muito semelhantes aos métodos de uso de classes InputStream, classes de saída de saída e suas subclasses. Mas os parâmetros nele são substituídos por caracteres ou matrizes de caracteres.
1. Métodos comuns de classe de leitor e classe de escritor
A classe do leitor é uma classe abstrata. Todos os métodos desta classe lançarão uma exceção da IOException em condições de erro. Os métodos comuns são os seguintes:
(1) Resumo Void Close (): Feche a fonte de entrada.
(2) Marca void (int numchars): Coloque uma marca no ponto atual da fonte de entrada.
(3) Boolean MarkSupportd (): Se esse fluxo suportar o método Mark/Redefinir, True será retornado.
(4) int read (): Leia um único caractere.
(5) Int Read (char [] buf): Leia os caracteres na matriz de personagens.
(6) Resumo Int Read (char [] buf, int offset, int numchars): Leia os caracteres em uma parte da matriz.
(7) Boolean Ready (): Retorne true se a próxima solicitação de entrada não precisar esperar, caso contrário, retorne false.
(8) Void Reset (): Redefina o ponteiro de entrada para o conjunto marcado antes.
(9) Skip longo (numchars longo): pule a entrada de caracteres e retorne o número real de caracteres ignorados.
A classe do escritor também é uma classe abstrata, e os métodos comumente usados são os seguintes:
(1) Abstract Void Close (): Feche o fluxo de saída.
(2) Resumo Void Flush (): determine o status de saída para limpar qualquer cache.
(3) Void Write (int ch): Escreva um único caractere.
(4) Void Write (char [] BUF): Escreva para uma matriz de caracteres.
(5) Resumo Void Write (char [] BUF, Int Offset, int numchars): Escreva parte da matriz de caracteres.
(6) Void Write (String str): Escreva uma string.
(7) Void Write (String str, Int Offset, int numchars): Escreva parte da string.
2. Classe FileReader
A classe FileReader herda da classe InputStreamReader e a classe InputStreamReader herda da classe Reader. Portanto, os métodos fornecidos pela classe Reader e pela classe InputStreamReader podem ser usados para objetos criados pela classe FileReader. Os métodos construtores do FileReader são:
FileReader (arquivo de arquivo);
FileReader (FileDescriptor E);
FileReader (nome do arquivo de string);
3. Classe FileWriter
A classe FileWriter herda da classe O outputStreamWriter e a classe O outputStreamWriter herda da classe Writer. Portanto, os métodos fornecidos pela classe Writer e pela classe OputStreamWriter podem ser usados pelos objetos criados pela classe FileWriter. Os métodos construtores do FileWriter são:
FileWrite (arquivo filepath);
FileWrite (arquivo f, apêndice booleano);
FileWrite (FileDescriptor E);
FileWrite (nome do arquivo de string);
FileWrite (nome do arquivo de string, apêndice booleano);
4. Classe BufferredReader
A classe BufferredReader herda da classe Reader, que é usada para ler dados no buffer. A classe BufferredReader pertence a fluxos de filtragem e outros fluxos como o FileReader são frequentemente usados como entrada ou saída. Seus métodos de construção são:
BufferredReader (leitor in);
BufferredReader (leitor in, int bufsize);
Por exemplo:
FileReader fr = new FileReader ("d: /1.txt");
BufferredReader BUF = new BufferredReader (FR);
BufferredReader fornece o método readerline () para ler todas as linhas de texto.
5. Classe Bufferwriter
A classe bufferwriter herda da classe Writer, e a classe BufferWriter é usada para gravar dados no buffer. O uso da classe BufferWriter é semelhante ao uso da classe BufferErader. A diferença é que os dados no buffer devem ser limpos pelo método Flush () no final, ou seja, escreva todos os dados no buffer no arquivo. Seus métodos de construção são:
BufferWriter (Writer Out);
BufferWriter (Writer Out, int bufsize);
4. Classe RandomAccessFile
O acesso aleatório do arquivo em Java requer o uso da classe RandomAccessFile (esta classe permite o acesso de qualquer local, não apenas lê, mas também grave), que herda diretamente da classe de objeto e implementa as interfaces DataAinput e o DataOutput.
Como a classe RandomAccessFile implementa todos os métodos definidos nas interfaces DataAinput e DataOutput, ele pode ler dados de tipo básico do arquivo e gravar dados de tipo básico no arquivo. Além dos métodos definidos nas interfaces DataAinput e DataOutput, a classe RandomAccessFile também define alguns outros métodos para suportar acesso aleatório.
O fluxo criado pela classe RandomAccessFile é diferente dos fluxos de entrada e saída anteriores. A classe RandomAccessFile não é uma subclasse da classe InputStream na classe de fluxo de entrada, nem uma subclasse da classe OputStream na classe de fluxo de saída. No entanto, a direção do fluxo criada pela classe RandomAccessFile pode ser usada como fonte e um destino. Em outras palavras, ao ler e escrever um arquivo, você pode criar um fluxo aleatório e o fluxo apontando para o arquivo, para que você possa ler os dados do arquivo do fluxo e gravar dados no arquivo através do fluxo.
Dois métodos construtores da classe RandomAccessFile:
(1) RandomAccessFile (nome da string, modo string)
O nome do parâmetro é usado para determinar um nome de arquivo, fornecendo a fonte (também o destino de fluxo) do fluxo criado, e o modo de parâmetro leva R (somente leitura) ou RW (leitura-escrivão), que determina os direitos de acesso do fluxo criado para o arquivo.
(2) RandomAccessFile (arquivo de arquivo, modo string)
O arquivo de parâmetro é um objeto de arquivo, que fornece a fonte (também o destino do fluxo). O modo parâmetro leva R (somente leitura) ou RW (leitura-escrivão) e determina os direitos de acesso do fluxo criado para o arquivo. Ao criar um objeto, a FileNotFoundException deve ser capturada; Quando o fluxo executa operações de leitura e gravação, a IoException deve ser capturada.
O método de ler e escrever informações do objeto RandomAccessFile é o mesmo que o método de entrada e saída do objeto de dados. Ele pode acessar todos os métodos Read () e Write () nas classes DataAinputStream e DataOutputStream.
Como mover o arquivo Read e escrever ponteiros:
(1) Long getFilePointer (): Retorna o local atual do ponteiro do arquivo.
(2) Void Seek (POS longo): Coloque o ponteiro do arquivo na posição absoluta especificada. O valor da posição é calculado como o PoS de compensação de byte desde o início do arquivo. POS é 0, que representa o início do arquivo.
(3) comprimento longo (): Retorna o comprimento do arquivo. O valor da posição é o comprimento (), que representa o final do arquivo.