Os fluxos são um conceito abstrato de sequências de bytes.
Os arquivos são formulários de dados estáticos de armazenamento, enquanto os fluxos se referem ao formulário quando os dados são transmitidos.
As classes de fluxo são divididas em duas categorias principais: classes de fluxo de nó e classes de fluxo filtrado (também chamadas de classes de fluxo de processo).
A classe correspondente ao dispositivo de destino é chamada de classe de fluxo do nó. O programa também pode chamar a classe de fluxo de nós através de uma classe de fluxo indireta para obter uma leitura mais flexível e conveniente de vários tipos de dados. Essa classe de fluxo indireta é a classe de fluxo de filtro (também chamada de classe de fluxo de processamento) ou a classe de embalagem.
O processo de chamada da classe Wrapper é o seguinte:
A relação entre a classificação de fluxo
Não importa quão rico e complexo seja a classificação dos fluxos, suas raízes vêm de quatro classes básicas. A relação entre essas quatro classes é a seguinte:
| Fluxo de bytes | Fluxo de caracteres | |
| Fluxo de entrada | InputStream | Leitor |
| Fluxo de saída | OutputStream | Escritor |
O Unicode codifica caracteres armazenados em Java, e a classe de processamento de fluxo de caracteres é responsável por converter outros fluxos de caracteres codificados externos e fluxos de caracteres Unicode em Java. As classes InputStreamReader e O outputStreamWriter lidam com as conversões de fluxos de caracteres e fluxos de bytes. Um fluxo de caracteres (pode lidar com um buffer de cada vez) é mais eficiente em uma operação do que um fluxo de bytes (um byte de cada vez).
InputStream
Como o InputStream e o OutputStream são classes abstacentes, eles não podem indicar a qual dispositivo IO corresponde. Existem muitas subclasses abaixo deles, incluindo dispositivos de IO específicos, como redes, pipelines, memória, arquivos etc. e seus vários objetos de subclasse usados em programas reais.
NOTA: Chamamos a fonte de IO e o destino correspondente à classe de fluxo do nó do nó do fluxo (nó).
Nota: Ao escrever o conteúdo do arquivo A para o arquivo B, o programa usa a classe de saída ou a classe de entrada para a operação do arquivo A. A classe de entrada e saída é relativa ao programa, não em nome do arquivo, portanto, devemos criar uma classe de entrada para concluir a operação no arquivo A e uma classe de saída para concluir a operação em arquivo B.
OutputStream
Leitor/escritor de fluxo orientado para o personagem
Um fluxo direcionado por caracteres Unicode significa ler o fluxo ou escrever informações para o fluxo em caracteres Unicode. Da mesma forma, o leitor/escritor também é uma classe abstacta.
Leitor
Escritor
Reutilização do código do programa de IO:
Geralmente, ao escrever código, use -1 como o final da entrada do teclado e não use o System.in diretamente na função escrita. É apenas que, ao chamar a função, o System.in é passado como um parâmetro. Dessa forma, quando queremos ler os dados de um arquivo no futuro para substituir a entrada manual do teclado, podemos usar essa função diretamente, para que o programa não precise fazer muitas modificações, para alcançar o efeito de imutável e adaptação às alterações.
Conversão de fluxos de bytes e fluxos de caracteres
InputStreamReader e OutputStreamReader: converta um fluxo orientado a bytes em um fluxo orientado para o caractere.
A classe InputStreamReader é uma ponte de um fluxo de bytes para um fluxo de caracteres: lê nos bytes e a converte em um fluxo de caracteres de acordo com o método de codificação especificado.
O método de codificação usado pode ser especificado pelo nome ou pelo método de codificação padrão aceitável para a plataforma.
Cada chamada para um dos métodos read () do InputStreamReader pode fazer com que um ou mais bytes sejam lidos no fluxo de entrada de bytes básicos.
Para obter maior eficiência, considere encapsular o InputStreamReader com o BufferErader.
BufferredReader in = new BufferredReader (new InputStreamReader (System.in));
Um resumo do uso de streaming de java
Encontrei muitos fluxos de Java no meu trabalho mais profissional, e o resumo é o seguinte:
1. Gere formato ZIP. O que você encontra é gerar arquivos ZIP em um servlet, emitê -los para o cliente da Web e baixá -los diretamente.
Response.setContentType ("Application/Zip"); Response.AddHeader ("Content-Disposition", "Anexamento; nome do arquivo =/" xxx.zip/ ""); ZipOutputStream out = new ZipOutputStream (Response.getOutputStream ()) para () {entrada zipentry = new Zipentry ("aa" + i ".dat"); out.putNewentry (entrada); bytes [] bt = s.getBytes (); out.WriteBytes (Bt, 0, Bt.Length ()); out.CloseEntry (); } out.flush (); out.Close (); ZipOutputStream herda do java.io.FilterOutputStream. Portanto, a operação de gravação real é gravada através do parâmetro OutputStream Out.
Sua escrita vazia (byte [] b, int off, int len) finalmente chama.write (b, desligado, len);
Se você deseja gerar um arquivo zip, escreva novo ZipOutputStream (new FileOutputStream (Path));
2. Escrita semelhante XML.
XMLWriter Writer = New XMLWriter (new FileOutputStream (Path), Formatter)
Writer.write (doc). O princípio é semelhante ao acima
3. Escreva arquivos de texto e adicione -os.
PrintStream ps = new PrintStream (new FileOutputStream (Path, True), "UTF-8") PS.PRINTLN (S); // pode escrever vários tipos, como boolean, int, etc.PrintSteam também herda do FilterOutputStream
DataOutputStream Out = new DataOutputStream (Socket.getOutputStream ()); out.WriteBytes (BT); out.WriteBoolean (booleano v);
DataOutputStream também é um FilterOutputStream.
5. Leia do texto
BufferredReader Reader = New BufferredReader (new FileReader (Path)); leitor.readline ();
O padrão BufferredReader é o mesmo que o padrão de filtro acima. Ele armazena um objeto que o objeto do leitor é passado como parâmetro e usado para realmente ler.
A classe correspondente ao Java 1.0 do BufferReader é o bufferInputStream, que é um FilterInputStream.
6. Leia do soquete
BufferInputStream IS = new BufferInputStream (Socket.getInputStream ()); is.read (bt, 0, bt.Length ());
Resumir:
As séries de fluxos de classe base são InputStream e OutputStream. São classes abstratas e os únicos métodos necessários são (tome a saída como exemplo)
Void Write (int b) lança IoException; Void Write (byte b []) lança ioexceptionvoid write (byte b [], int off, int len)
A coisa mais básica é a operação de bytes. O primeiro método parece escrever um número inteiro, mas na verdade ele escreve apenas um byte (os oito bits mais baixos). Sua subclasse é dividida em duas séries, uma é operar diretamente o dispositivo de saída. O que encontramos acima são o arquivo (FileOutputStream) e a saída do servlet (ServletOutputStream). Outros comumente usados também são um bytearrayoutputStream, que é operado diretamente na memória.
Em seguida, é a série FilterOutputStream, que recebe um parâmetro de assento do objeto de saída e a operação de gravação real é concluída através do objeto. Por exemplo, o ZipOutputStream é responsável apenas pela geração de dados compactados. Quanto a esses dados são gravados para arquivar, memória ou servletResponse, eles são determinados pelos parâmetros de entrada. Este é o padrão do decorador.
As operações comumente usadas na série de filtros incluem PrintStream (fornecendo impressão, println, write (boolean [int, char, string]) e, finalmente, usando o método out.write para gravá -lo em bytes.
Há também DataOutputStream, que fornece WriteByte/WriteBoolean/Writedouble/WriteLong/WireTutf e outros métodos.
Há também soquete/zip e outras coisas que não são comumente usadas.
O streaming de Java é muito conveniente e complicado. A complexidade significa que a implementação de uma função geralmente requer várias classes e existem várias combinações. Ainda precisa ser resumido na prática.