Okuyucular ve Yazıcılar
Okuyucular ve yazıcılar InputStream ve OutputStream kullanarak bir kural dışı durumla benzer fonksiyonlar gerçekleştirirler: Bunlar byte yerine karakterlerle çalışırlar. Okuyucular ve yazıcılar sırasıyla karaktere yönelik (yazı tabanlı) girdi ve çıktı akımlar için süper sınıflardır. Bu sınıfların özelleşmiş alt sınıfları farklı türdeki akımlar için gerekli gerçekleştirmeleri sağlar. Bu özelleşmiş alt sınıflardan bazıları şunlardır:
Okuyucu Yazıcı Kaynak/Alıcı Türü
FileReader FileWriter Diskte bir dosya. Dosya yapılandırıcıya geçirilebilir.
CharArrayReader CharArrayWriter Bellekte bir karakter dizisi. Karakter dizisi türünden bir ara bellek yapılandırıcıya geçirilebilir.
StringReader StringWriter Bellekte dizgi. Bir dizgi StringReader'in yapılandırıcısına geçirilebilir ve bir ilk büyüklük StringWriter'ın yapılandırıcısına geçirilebilir.
PipedReader PipedWriter Bir başka iş parçacıcı (karakterleri okumadan/yazmadan önce PipedReader'i PipedWriter'a bağlar). PipedWriter'dan yazılan herşey PipedReader'dan okunabilir.
InputStream gibi, Reader (Okuyucu) da karakterleri okumak için üç yöntem tanımlar:
Yöntem Tanımlama
int read() Akımdan bir sonraki byte'ı okur.
int read(char[] b) Akımdan k<=b.length karakterleri okur ve okunan karakterlerin sayısını döndürür. Eğer yeterli veri varsa, akım arabellek b'yi doldurur, yoksa akım karakterleri koyar ve b[0]'dan başlayarak okur.
int read(char[] b, int offset, int length) Akımdan k<=b.length karakterleri okur, bu karakterleri b[offset]'den başlayarak koyar ve okunan karakterlerin sayısını döndürür.
Eğer akımın sonuna ulaşılmışsa, okuma yöntemi -1 döndürür. Ayrıca akımdan kaç karakteri okumanın mümkün olduğunu available() yöntemi kullanarak öğrenmek de mümkün.
Writer (Yazıcı) karakter ve dizgileri yazmak için beş yöntem tanımlar:
Yöntem Tanımlama
Void write(int b) (char)b'yi akıma yazar.
void write(char[] b) b'deki b.length karakteri akıma yazar.
void write(char[] b, int offset, int length) b'deki length karakteri b[offset]'den başlayarak akıma yazar.
void write(String s) dizgi s'yi akıma yazar.
void write(String s, int offset, int length) dizgi s'deki length karakteri, offset posizyonundaki karakterden başlayarak akıma yazar.
Diğer Okuyucu ve Yazıcı sınıflarla sarıcı okuyucular ve yazıcılar kullanarak daha yararlı arayüzlere sahip olmak mümkün. Örneğin bir okuyucuyu BufferedReader ile sararak karakterlere ve karakter dizilerine ek olarak dizgileri de okuyabilirsiniz. Örneğin aşağıdaki kod bir FileReader'i dizgileri satır satır okumak ve ekrana yazmak için BufferedReader içinde sarar :
BufferedReader r = new BufferedReader(new FileReader("textfile.txt"));
String s;
while((s=r.readLine())!=null) System.out.println(s);

InputStreamReader ve OutputStreamWriter sınıfları InputStreamleri ve OutputStreamleri yazı tabanlı I/O için Okuyucular ve Yazıcılar içinde sarmak için bir mekanizma sağlar.