"Oi, amigo, mais uma vez."

"Olá para você, Rishi. Sobre o que será a lição de hoje?"

"Hoje vou falar sobre Leitor e Escritor."

"Mas, Rishi, eu já sei quase tudo sobre eles!"

"A repetição é a mãe do aprendizado."

"Hmm. Bem, tudo bem."

" Reader e Writer são análogos a InputStream e OutputStream , mas trabalham com caracteres, não bytes. Às vezes, eles também são chamados de fluxos de caracteres, em oposição a  InputStream  e  OutputStream , que são chamados de fluxos de bytes."

"Um é para caracteres, o outro é para bytes. Eu me lembro."

"Não é só isso. Essas classes são especialmente projetadas para trabalhar com texto e strings. Hoje veremos duas implementações clássicas dessas classes abstratas: FileReader e FileWriter ."

"Aqui estão os métodos da classe FileReader :"

Método Descrição
int read() Lê um caractere do fluxo e o retorna.
int read(char cbuf[], int offset, int length) Lê uma matriz de caracteres, retorna o número de caracteres lidos.
boolean ready() Retorna verdadeiro se for possível ler do fluxo.
void close() Fecha o fluxo de entrada.
int read(java.nio.CharBuffer target) Ler um conjunto de caracteres em um buffer.
int read(char cbuf[]) Lê uma matriz de caracteres.
long skip(long n) Ignora n caracteres no fluxo.
String getEncoding() Retorna a codificação atual do stream.

"Bem, eu sei quase tudo isso. Mas e o FileWriter?"

Método Descrição
void write(int c) Grava um caractere no fluxo.
void write(char cbuf[], int off, int len) Grava uma matriz de caracteres no fluxo.
void write(char cbuf[]) Grava uma matriz de caracteres no fluxo.
void write(String str, int off, int len) Grava parte de uma cadeia de caracteres no fluxo.
void write(String str) Grava uma cadeia de caracteres no fluxo.
void flush() Grava tudo armazenado em cache na memória para o disco.
void close() Fecha o fluxo.
String getEncoding() Retorna a codificação atual do stream.

"Eu sei que!"

"Isso é maravilhoso. Então vamos dar uma olhada em um exemplo interessante, e mais tarde Diego lhe dará mais tarefas."

"Como você lê um arquivo linha por linha? Você pode escrever o código?"

"Fácil, olha:"

Código
// Create a list for storing the lines
List<String> list = new ArrayList<String>();

// Open the file
File file = new File("c:/document.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));

// As long as the file isn't empty, read from it
while (reader.ready())
{
 list.add(reader.readLine());
}

// Close the file
reader.close();

"Hmm. Nada mal."

"Nada mal? É tudo simples e bonito. Admita, Rishi - eu já tenho um excelente domínio dos encadeamentos de E/S. Então, o que poderia ser melhorado aqui?"

"Bem, por exemplo, você poderia fazer isso:"

Código de Rishi
File file = new File("c:/document.txt");

List list = Files.readAllLines(file.toPath(), Charset.defaultCharset());

"Hmm. Isso é mais curto. E hoje mesmo você me contou sobre todos esses métodos. Vou retrabalhá-lo. Obrigado pela lição, Rishi."

"Boa sorte, amigo."