Stream'ler (InputStream ve OutputStream) byte okumak için kullanılılır. Bunları (veya bunları extend eden class'ları) kullanarak text, yani string okunabilir. Ancak bu durumda character encoding'in bu class'lara verilmesi gerekir. Çünkü 'byte' tipindeki verileri 'char' tipine dönüştürmek için encoding gereklidir. Çünkü, örneğin 'Ç' karakterinin byte olarak değeri bir dilin encoding'inde, 123 diğerinde 127 olabilir. Bunun için Reader ve Writer classları yapılmıştır. Reader'lar ve Writer'lar ortamın encoding'ini alıp byte'la char arasındaki dönüşünü otomatik olarak yaparlar. Bunlar da aslında içlerinde birer stream'e sahiptirler ama bu programcıyı ilgilendirmez.
Stream'ler için olduğu gibi Reader ve Writer'ların da buffer'lı versiyonları BufferedReader ve BufferedWriter bulunmaktadır. Performansı arttırmak için kullanılmaları faydalı olur.
Reader'lar
Character ve text tipinde data okumak için InputStream'ler yerine Reader'lar kullanılır.
Bir text dosyasını satır satır okuyup ekrana basan bir application yazalım.
1 import java.io.*;
2 publicclass TextWriter{ 3 publicstaticvoid main(String[] args) 4 throws Exception
5 { 6 String filename="c:\\myfolder\\myfile.ext";
7 FileWriter file=new FileWriter(filename);
8 PrintWriter out=new PrintWriter(file);
9 String text="Java is a powerful programming language and platform.\n";
10 text+="However it is still evolving and far from being perfect.\n";
11 text+="On the other hand, no other language as promising as Java.\n";
12 out.print(text);
13 out.close();
14 } 15 }