Nas seções anteriores, aprendemos sobre fluxos de entrada e saída de bytes de arquivo e fluxos de entrada e saída de caracteres de arquivo. Nesta seção, aprendemos um novo conceito - fluxos com buffer . Então, o que é um fluxo em buffer? Qual o papel que os fluxos de buffer podem desempenhar?
Em Java, chamamos os objetos criados pelas classes BufferedReader e BufferedWriter de fluxos de entrada e saída em buffer, o que aprimora a capacidade de ler e gravar arquivos. Por exemplo, Student.txt é uma lista de alunos, com cada nome ocupando uma linha. Se quisermos ler o nome, devemos ler uma linha por vez. É difícil concluir tal tarefa usando o fluxo FileReader, porque não sabemos quantos caracteres há em uma linha, e a classe FileReader não sabe. forneça um método para ler uma linha.
Java fornece fluxos mais avançados: fluxo BufferedReader e fluxo BufferedWriter A origem e o destino de ambos devem ser o fluxo de entrada de caracteres e o fluxo de saída de caracteres. Portanto, se o fluxo de entrada de caracteres do arquivo for usado como origem do fluxo BufferedReader e o fluxo de saída de caracteres do arquivo for usado como destino do fluxo BufferedWriter, os fluxos criados pelas classes BufferedReader e BufferedWriter terão leitura e gravação mais fortes recursos do que o fluxo de entrada de caracteres e a capacidade de fluxo de saída de caracteres. Por exemplo, um fluxo BufferedReader pode ler arquivos linha por linha.
Os construtores da classe BufferedReader e BufferedWriter são:
BufferedReader(Leitorin);BufferedWriter(Writerout);
Os fluxos BufferedReader podem ler linhas de texto usando readLine() . Crie um objeto BufferedReader passando um objeto de uma subclasse Reader, como uma instância de FileReader, para BufferedReader, por exemplo:
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(inOne);
Então o fluxo inTwo chama o método readLine() para ler Student.txt, por exemplo:
StringstrLine=inTwo.readLine();
Da mesma forma, você pode conectar um fluxo BufferedWriter e um fluxo FileWriter e, em seguida, usar o fluxo BufferedWriter para gravar dados no destino, por exemplo:
FileWritertofile=newFileWriter(hello.txt);BufferedWriterout=BufferedWriter(tofile);
Em seguida, out usa o método write(String s, int off, int len) da classe BufferedReader para escrever a string s em hello.txt. O parâmetro off é o deslocamento desde o início de s, e len é o número de caracteres escritos. .
Além disso, o fluxo BufferedWriter possui um método exclusivo para gravar um caractere de nova linha no arquivo:
novaLinha();
BufferedReader e BufferedWriter podem ser chamados de fluxo superior, e o fluxo de caracteres para o qual eles apontam é chamado de fluxo subjacente. Java usa tecnologia de cache para conectar o fluxo superior e o fluxo subjacente. O fluxo de entrada de caracteres subjacente primeiro lê os dados no cache, o fluxo BufferedReader então lê os dados do cache; o fluxo BufferedWriter grava os dados no cache e o fluxo de saída de caracteres subjacente grava continuamente os dados no cache para o destino; . Quando o fluxo BufferedWriter chama flush() para atualizar o cache ou chama o método close() para fechar, mesmo que o cache não estoure, o fluxo subjacente gravará imediatamente o conteúdo armazenado em cache no destino.
Nota : Ao fechar o fluxo de saída, você deve primeiro fechar o fluxo de saída em buffer e, em seguida, fechar o fluxo apontado pelo fluxo de saída em buffer, ou seja, primeiro fechar o fluxo superior e depois fechar o fluxo inferior. Basta fechar o fluxo superior ao escrever o código e o fluxo subjacente do fluxo superior será fechado automaticamente.
Por exemplo:
O arquivo english.txt composto por frases em inglês é o seguinte, cada frase ocupa uma linha:
A flecha errou o alvo. Eles rejeitaram a exigência do sindicato. Para onde vai esse caminho?
É necessário ler english.txt linha por linha, adicionar o número de palavras contidas na frase em inglês após a linha e, em seguida, escrever a linha em um arquivo chamado englishCount.txt.
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){FilefRead=newFile(english.txt);FilefWrite=newFile(englishCount.txt);try{Writerout=newFileWriter(fWrite);BufferedWriterbufferWrite= newBufferedWriter(out);Readerin=newFileReader(fRead);BufferedReaderbufferRead=newBufferedReader(in);Stringstr=null;while((str=bufferRead.readLine())!=null){StringTokenizerfenxi=newStringTokenizer(str);intcount=fenxi. countTokens();str=str+número de palavras na frase:+count;bufferWrite.write(str);bufferWrite.newLine();}bufferWrite.close();out.close();in=newFileReader(fWrite) ;bufferRead =newBufferedReader(in);Strings=null;System.out.println(fWrite.getName()+content:);while((s=bufferRead.readLine())!=null){System.out.println( s) ;}bufferRead.close();in.close();}catch(IOExceptione){System.out.println(e.toString());}}}
Os resultados da execução são os seguintes:
EnglishCount.txt conteúdo:A seta errou o alvo. O número de palavras na frase: 5 Eles rejeitaram a demanda sindical. O número de palavras na frase: 5 Para onde vai essa estrada? O número de palavras na frase: 6