BufferInputStream
BufferInputStream é um fluxo de entrada em buffer. Herda do filtroinputStream.
O objetivo do bufferInputStream é adicionar alguns recursos a outro fluxo de entrada, como fornecer "funcionalidade de buffer" e suportar "Mark () Marks" e "Reset () RESET Métodos".
BufferInputStream é essencialmente implementado por meio de uma matriz de buffer interna. Por exemplo, depois de criar um bufferInputStream correspondente a um determinado fluxo de entrada, quando lemos os dados do fluxo de entrada através do read (), o bufferInputStream preencherá os dados do fluxo de entrada no buffer em lotes. Sempre que os dados no buffer são lidos, o fluxo de entrada preencherá o buffer de dados novamente; Isso será repetido até terminarmos de ler o local dos dados do fluxo de entrada.
Lista de funções bufferInputStream:
BufferedInputStream(InputStream in)BufferedInputStream(InputStream in, int size)synchronized int available()void close()synchronized void mark(int readlimit)boolean markSupported()synchronized int read()synchronized int read(byte[] buffer, int offset, int byteCount)synchronized void reset()synchronized long skip(long bytecount)
Código de exemplo:
Para uso detalhado da API no bufferInputStream, consulte o código de exemplo (bufferInputStreamTest.java):
importar java.io.BufferEnputStream; importar java.io.byteArrayInputStream; importar java.io.file; importar java.io.inputStream; importar java.io.fileInputStream; import java.io.ioexception; import java.io.filenExcendException; Programa de teste * * @Author Skywang */public classe bufferInputStreamTest {private estático final int len = 5; public static void main (string [] args) {testBufferInputStream (); } / *** Função de teste da API do bufferInputStream* / private estático void testBufferedInputStream () {// Crie um fluxo byte bufferInputStream, o conteúdo é uma arrayLetters Array Try {arquivo file = new File ("file (" bufferInputStream.txt "); InputStream in = new bufferInputStream (new FileInputStream (arquivo), 512); // Leia 5 bytes do fluxo de bytes. "ABCDE", A corresponde a 0x61, b corresponde a 0x62, e assim por diante ... para (int i = 0; i <len; i ++) {// se você puder continuar lendo o próximo byte, leia o próximo byte "Int (in.Available ()> = 0) {// leia" a seguir, por fluxo de stream ", System.out.printf ("%d: 0x%s/n", i, integer.tohexstring (tmp)); }} // Se "este fluxo de bytes" não suporta a função de marcação, saia diretamente se (! In.marksupported ()) {System.out.println ("Make não suportado!"); retornar ; } // Marque a "posição do índice atual", ou seja, marque o elemento da 6ª posição - "f" // 1024 corresponde ao Marklimit in.mark (1024); // Pule 22 bytes. in.skip (22); // Leia 5 bytes byte [] buf = novo byte [len]; in.read (buf, 0, len); // converte BUF em uma string string. String str1 = new string (buf); System.out.printf ("str1 =%s/n", str1); // Redefina o "índice do fluxo de entrada" para a posição marcada por Mark (), ou seja, redefinida para "f". in.Reset (); // Leia 5 bytes em BUF a partir de "Reset Byte Stream". Isto é, leia "fghij" in.read (buf, 0, len); // converte BUF em uma string string. String str2 = new string (buf); System.out.printf ("str2 =%s/n", str2); in.Close (); } catch (filenotfoundException e) {e.printStackTrace (); } Catch (SegurançaException e) {E.PrintStackTrace (); } catch (ioexception e) {e.printStackTrace (); }}} O conteúdo do bufferinputstream.txt lido no programa é o seguinte:
abcdefghijklmnopqrSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Resultados em execução:
0: 0x611: 0x622: 0x633: 0x644: 0x65str1 = 01234str2 = fghij
BufferoudOutputStream
BufferoudOutputStream é um fluxo de saída em buffer. Herda do filterOutputStream.
A função do BufferedOutputStream é fornecer "buffer" a outro fluxo de saída.
Lista de funções bufferoututputStream:
BufferOutputStream (outputStream) bufferoututputStream (saída de outputStream Out, int size) Sincronizado Void Close () sincronizado void Flush () Sincronizado Void Write (Byte [] Buffer, Int Offset, Int Length) Syncronized Void Write (int OneByte)
Código de exemplo:
Para uso detalhado da API no BufferoudOutputStream, consulte o código de exemplo (BufferoudOutputStreamTest.java):
importar java.io.bufferedOutputStream; importar java.io.file; importar java.io.OutputStream; importar java.io.fileOutputStream; importar java.io.ioException; import java.io.filenotFoundException; import java.lang.SechingSception; Import.io.io. @Author Skywang */classe pública BufferOutputStreamTest {private Static final int len = 5; // Corresponding to English letters "abcddefghijklmnopqrssttuvwxyz" private static final byte[] ArrayLetters = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a}; public static void main (string [] args) {testBufferoudOutputStream (); } / *** Função de teste da API de BufferoudOutputStream* / private estático void testBufferedOutputStream () {// Crie o bufferoutoutputStream correspondente a "Stream de saída de arquivo" // O tamanho do buffer correspondente é 16, ou seja, quando os dados do buffer> = 16, o conteúdo do buffer será escrito automaticamente para o fluxo de saída. tente {arquivo file = new File ("out.txt"); OutputStream out = new BufferOutputStream (new FileOutputStream (FILE), 16); // Escreva os primeiros 10 bytes da matriz de matrizes para o fluxo de saída. // escreva o "newline/n" para o fluxo de saída fora.write ('/n'); // PENDÊNCIA! // out.flush (); readUserInput (); out.Close (); } catch (filenotfoundException e) {e.printStackTrace (); } Catch (SegurançaException e) {E.PrintStackTrace (); } catch (ioexception e) {e.printStackTrace (); }} / *** Leia a entrada do usuário* / private estático void readUserInput () {System.out.println ("Insira um texto:"); Scanner Reader = new Scanner (System.in); // Aguarde por uma string de entrada str = leitor.next (); System.out.printf ("A entrada é: %s/n", str); }} Resultados em execução:
Gere o arquivo "out.txt" e o conteúdo do arquivo é "abcdefghij".
Teste passo a passo: siga as três etapas a seguir para testar o programa para visualizar o tamanho do buffer e o papel de Flush ().
Tipo 1: Programa original
(1) Execute o programa. Quando o programa estiver aguardando a entrada do usuário, verifique o conteúdo do texto de "out.txt"; Encontre: o conteúdo está vazio.
(2) Execute o programa. Após a entrada do usuário, verifique o conteúdo do texto de "out.txt"; Encontre: o conteúdo é "abcdefghij".
A partir disso, descobrimos que os resultados de (01) e (02) são diferentes; A razão pela qual o conteúdo out.txt em (01) está vazio é porque o tamanho do buffer correspondente ao out.txt é 16 bytes e apenas escrevemos 11 bytes, para que não execute a operação de buffer transparente (ou seja, gravar dados do buffer no fluxo de saída).
O conteúdo correspondente a out.txt é "abcdefghij", porque out.close () é executado, que fecha o fluxo de saída; Antes de fechar o fluxo de saída, os dados do buffer serão gravados no fluxo de saída.
Nota: Ao reestar, primeiro exclua.txt.
Tipo 2: Adicione a seguinte declaração antes de readUserInput ()
out.flush ();
O objetivo desta frase é escrever o "conteúdo do buffer" no fluxo de saída.
(1) Execute o programa. Quando o programa estiver aguardando a entrada do usuário, verifique o conteúdo do texto de "out.txt"; Encontre: o conteúdo é "abcdefghij".
(2) Execute o programa. Após a entrada do usuário, verifique o conteúdo do texto de "out.txt"; Encontre: o conteúdo é "abcdefghij".
A partir disso, descobrimos que o mesmo resultado que (01) e (02), o conteúdo correspondente de out.txt é "abcdefghij". Isso ocorre porque a operação Flush () é realizada, que é usada para gravar os dados do buffer no fluxo de saída.
NOTA: Ao testar novamente, exclua.txt primeiro!
Tipo 3: com base no primeiro tipo,
out.Write (ArrayLetters, 0, 10);
Modificado para
out.write (ArrayLetters, 0, 20);
(1) Execute o programa. Quando o programa estiver aguardando a entrada do usuário, verifique o conteúdo do texto de "out.txt"; Descubra que o conteúdo é "abcdefghijklmnopqrst" (excluindo Enter).
(02) Execute o programa. Após a entrada do usuário, verifique o conteúdo do texto de "out.txt"; Descubra que o conteúdo é "abcdefghijklmnopqrst" (incluindo Enter).
A partir disso, descobrimos que (01) o resultado da corrida é "abcdefghijklmnopqrst" (excluindo o retorno do carro). Isso ocorre porque o tamanho do buffer é de 16 e escrevemos 20 bytes por fora.Write (ArrayLetters, 0, 20), excedendo o tamanho do buffer; No momento, todas as entradas serão escritas diretamente no fluxo de saída sem passar pelo buffer.
(3) O resultado da operação é "abcdefghijklmnopqrst" (incluindo retorno do transporte), porque ao executar.close (), o símbolo de retorno do carro '/n' é gravado no fluxo de saída.
NOTA: Ao testar novamente, exclua.txt primeiro!