Os fluxos IO geralmente existem em pares, com entrada (Input) e saída (Output), que é o processo de transferência de dados de um lugar para outro; para computadores, o processo de cópia de arquivos, a gravação e salvamento de arquivos e a exibição funções são todas IO é usado; o processo de transmissão de dados é considerado como uma entrada e saída.
Java IO, também conhecido como BIO (Blocking IO), é um modelo de IO fornecido pelo Java nos primeiros dias. É um IO bloqueante, ou seja, ao realizar uma operação de IO, a thread ficará bloqueada até que a operação de IO seja concluída. A introdução principal aqui é o modelo BIO.
Classificação IO:
De acordo com a direção do fluxo:
- Fluxo de entrada (entrada)
- Fluxo de saída (saída)
De acordo com o tipo de fluxo de processamento:
- fluxo de bytes (byte)
- fluxo de caracteres (char)
De acordo com a função de fluxo:
- Fluxo de nó (interagir diretamente com fontes de entrada e saída)
- Fluxos de processamento (fluxos que envolvem outros fluxos: fluxos de empacotamento)
fluxo de bytes:
InputStream é a superclasse de todos os fluxos de entrada de bytes, que fornece métodos básicos para leitura de dados de bytes. OutputStream é a superclasse de todos os fluxos de saída de bytes, que fornece métodos básicos para gravar dados de bytes.
FileInputStream/FileOutputStream :
Um fluxo de bytes para leitura e gravação de arquivos. Eles permitem que dados de bytes sejam lidos ou gravados em um arquivoByteArrayInputStream/ByteArrayOutputStream :
Um fluxo para ler e gravar matrizes de bytes na memória.BufferedInputStream/BufferedOutputStream :
Fornece entrada e saída com função de buffer, que pode melhorar a eficiência da operação IOObjectInputStream/ObjectOutputStream :
Um fluxo para leitura e gravação de objetos Java. Eles podem serializar objetos Java em fluxos de bytes ou desserializar fluxos de bytes em objetos Java- PipedInputStream/PipedOutputStream: fluxos de pipeline para comunicação entre threads, eles fornecem um mecanismo para transferência de dados entre vários threads. PipedInputStream recebe dados de PipedOutputStream.
PipedOutputStream output = new PipedOutputStream(); // 订阅output PipedInputStream input = new PipedInputStream(output);
PrintStream:
fluxo de impressão de bytes
Fluxo de caracteres:
Reader/Writer: Reader é a superclasse de todos os fluxos de entrada de caracteres, que fornece métodos básicos para leitura de dados de caracteres. Writer é a superclasse de todos os fluxos de saída de caracteres, que fornece métodos básicos para gravar dados de caracteres.
InputStreamReader/OutputStreamWriter :
Um fluxo de ponte para converter um fluxo de bytes em um fluxo de caracteres. Eles convertem dados de bytes em dados de caracteres especificando uma codificação de caracteres.FileReader/FileWriter :
Um fluxo de caracteres para leitura e gravação de arquivos. Eles permitem que dados de caracteres sejam lidos ou gravados em um arquivo. Eles são implementações de fluxo de caracteres baseadas em FileInputStream e FileOutputStream.BufferedReader/BufferedWriter:
Um fluxo de caracteres que fornece funcionalidade de buffer. Eles podem melhorar a eficiência da leitura e gravação de fluxos de caracteres e reduzir o número de operações de E/S reais no sistema subjacente.CharArrayReader/CharArrayWriter:
Usado para ler e gravar dados de matriz de caracteres.PipedReader/PipedWriter:
Operações de fluxo de caracteres em fluxos canalizados.PrintWriter:
fluxo de impressão de personagem
fluxo em buffer
A eficiência do fluxo em buffer é maior que a dos fluxos de caracteres comuns e fluxos de bytes, porque no kernel do Linux, somente quando a informação gravada no buffer pelo fluxo em buffer atinge um certo limite ou quando o fluxo em buffer é atualizado, ele realmente gravados nas informações do disco, enquanto os fluxos comuns gravam dados no disco toda vez que são gravados. Um fluxo com buffer é um fluxo com seu próprio buffer, que consiste principalmente nos quatro tipos a seguir.
BufferedInputStream/BufferedOutputStream
: fluxo de entrada com buffer de byte/fluxo de saída com buffer de byteBufferedReader/BufferedWriter
: Fluxo de entrada do buffer de caracteres/fluxo de saída do buffer de caracteres
Fluxo de transformação:
Em alguns requisitos, muitas vezes é necessário converter os dados de um fluxo de bytes em um fluxo de caracteres; ou é necessário converter um fluxo de caracteres em um fluxo de bytes. Nesse caso, é necessário usar o fluxo de conversão para concluir o função. O fluxo de conversão é geralmente usado em: Transcodificação de arquivos, quando os dados lidos da rede são um fluxo de bytes, mas o fluxo contém caracteres, você pode usar o fluxo de conversão para realizar a conversão; o fluxo de conversão em java.io é composta principalmente pelas duas classes seguintes:
- InputStreamReader: usado para converter um fluxo de entrada de bytes em um fluxo de entrada de caracteres (byte -> caractere)
- OutputStreamWriter: usado para converter um fluxo de saída de caracteres em um fluxo de saída de bytes (caractere -> byte)
Java BIO, NIO, AIO:
O Java 1.4 começou a fornecer classes e interfaces relacionadas a NIO (New IO, non-blocking IO), como Channel, ByteBuffer e Selector, etc., para obter operações de IO mais eficientes. 1.7 começou a introduzir o modelo IO assíncrono AIO (Asynchronous IO). O AIO confia completamente a operação IO ao sistema, sem que o aplicativo espere a conclusão do IO.
-
Java IO (BIO):
Java IO, também conhecido como BIO (Blocking IO), é um modelo de IO fornecido pelo Java nos primeiros dias. É um IO bloqueante, ou seja, ao realizar uma operação de IO, a thread ficará bloqueada até que a operação de IO seja concluída. Java IO realiza operações de IO por meio de fluxos. As classes principais correspondentes incluem InputStream, OutputStream, Reader e Writer. Elas são síncronas e podem processar apenas uma solicitação por vez. No caso de grande quantidade de simultaneidade, o desempenho do modelo BIO é baixo. -
Java NIO:
Java NIO (New IO) é um novo modelo de IO introduzido pelo Java na versão 1.4, que fornece IO sem bloqueio. O NIO usa o conceito de canal (Channel) e buffer (Buffer), os dados são transmitidos pelo canal e o Buffer é usado para operações de leitura e gravação. Comparado com o BIO, o NIO tem maior desempenho e capacidade de processamento simultâneo. As classes principais incluem Selector, Channel e Buffer, etc. -
Java AIO:
Java AIO (Asynchronous IO) é um modelo de IO assíncrono introduzido pelo Java na versão 1.7. O AIO confia totalmente a operação de IO ao sistema, sem que o aplicativo espere que o IO seja concluído. Ele é baseado no evento e no mecanismo de retorno de chamada, lida com eventos de conclusão de IO por meio do CompletionHandler e pode lidar com várias solicitações de IO ao mesmo tempo. As classes principais incluem AsynchronousSocketChannel, AsynchronousServerSocketChannel e AsynchronousFileChannel, etc.