O Java.io usa padrões de design, como o modo decorativo do adaptador, para resolver os problemas de soquete e entrada e saída dos fluxos de caracteres.
O fluxo de bytes pode processar apenas um byte por vez e, para facilitar a operação de dados, o fluxo de soquete é adicionado.
Introdução ao problema:
Por que o fluxo em buffer é mais eficiente que os fluxos de bytes de arquivo comum?
Para operações sem buffer, um byte deve ser escrito para cada leitura de bytes.
Como as operações de IO envolvendo discos são muito mais lentas que as operações de memória, os fluxos sem buffer são muito ineficientes.
Um fluxo com buffer pode ler muitos bytes por vez, mas não escreve no disco, mas é colocado na memória primeiro.
Quando você tiver tamanho de buffer suficiente, escreva -o no disco ao mesmo tempo. Este método pode reduzir o número de operações de disco e a velocidade será muito maior!
Esta é a diferença entre os dois.
Provavelmente processo:
Se não houver área de cache, toda vez que você ler, uma operação de IO será enviada;
Existe uma área de cache. Quando você lê a primeira vez, o X bytes será lido e colocado na área de cache. Em seguida, as leituras subsequentes serão lidas no cache. Quando você lê até o final da área do cache, o X bytes será lido novamente e colocado na área de cache.
É óbvio que o segundo método reduzirá as operações de IO e será mais eficiente. A desvantagem é que ele consome mais memória.
Os fluxos de entrada e saída Java são projetados usando o encapsulamento de várias camadas
O nível mais baixo InputStream e o OutputStream são baseados em fluxos de bytes e não possuem mecanismo de cache. Eles geralmente são encapsulados e usados após o uso pelo BufferInputStream e BufferOutputStream.
O método de leitura do bufferInputStream bloqueia o thread. BufferInputStream.read (BUF) lerá todo o fluxo de entrada no BUF antes de retornar.
BufferOutputStream.Write (BUF); produzirá o conteúdo no BUF para o fluxo de saída, mas lembre -se de descarregar;
Há também um PrintStream e PrintWriter relativamente fáceis de usar que podem ser atualizados automaticamente, mas para fluxos de bytes.
Os fluxos de bytes são geralmente usados para transferir arquivos binários e outros fluxos de caracteres. Eles são frequentemente embrulhados com o leitor.
Os mais usados são BufferInputStreamReader e PrintWrinter. O método ReadLine do BufferInputStreamReader é muito prático e será liberado automaticamente ao encontrar /r /d.
PrintWrinter, desde que a propriedade Refresh seja definida como true no construtor, seu método Println pode ser automaticamente atualizado sem descarga.
FilterInputStream e FilterOutputStream: Fluxo do filtro, fluxo de buffer e fluxo de dados são herdados daqui.
Para fluxos de buffer, os dados serão realmente transferidos para o fluxo de saída somente quando o buffer estiver cheio, mas o método Flush () pode ser usado para enviar dados do buffer não preenchido artificialmente; O método de codificação do arquivo não pode ser determinado e é difícil de aplicar na rede.
O mais comumente usado na prática é que o fluxo de dados pode permitir que o remetente e o receptor processem de acordo com a mesma codificação.
DataAinputStream e DataOutputStream: podem aceitar uma linha de dados, podem codificá -lo ou pode ser um fluxo de soquete, pode ser o stream de bytes de soquete e o fluxo de bytes de rede, e a ordem de leitura e gravação deve ser consistente; caso contrário, ocorrerá uma exceção ao ler.
O DatainputStream é usado para decorar outros fluxos de entrada, que "permitem que os aplicativos leiam os tipos básicos de dados Java a partir do fluxo de entrada subjacente de maneira independente da máquina". Os aplicativos podem usar o DataOutputStream para gravar dados lidos por DatainputStream.
O exposto acima está o fluxo de fluxo de fluxo de fluxo de fluxo de fluxo e fluxo java.io e fluxo de dados introduzido pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!