"Yine ben."

"Merhaba Ellie!"

"Bugün size BufferedReader ve BufferedWriter hakkında her şeyi anlatmak istiyorum ."

"Bana onlardan zaten bahsetmiştin. Gerçekten o kadar da karmaşık değiller."

"Tamam. O zaman bana BufferedReader'ın nasıl çalıştığını anlat."

" BufferedReader 110/220V dönüştürücü gibidir."

" Verilerin okunacağı Reader nesnesini BufferedReader yapıcısına iletmeniz gerekir . Bir BufferedReader nesnesi, Reader'dan büyük miktarda veri okur ve bunları dahili olarak bir arabellekte saklar. Bu nedenle, bir Reader'dan okumak için BufferedReader kullanmak daha hızlıdır doğrudan Reader'dan okumaktansa ."

"Doğru. Peki ya BufferedWriter ?"

"Çok basit. Diyelim ki bir FileWriter'a yazdık . Veriler hemen diske yazılır. Sık sık küçük veri parçaları yazarsak, diske çok fazla vururuz ve bu da programı çok yavaşlatır. Ama 'converter' olarak BufferedWriter kullanırsak , yazma işlemi çok daha hızlı olur.Bir BufferedWriter'a yazdığınızda , verileri dahili bir arabelleğe kaydeder.Arabellek dolduğunda, verileri Writer'a şu şekilde yazar: tek bir büyük yığın. Bu çok daha hızlı."

"Hmm. Anladım. Ama neyi unuttun?"

"Yazmayı bitirdikten sonra, tamponda bulunan herhangi bir veriyi Writer'a göndermeye zorlamak için BufferedWriter nesnesinde flush ( ) yöntemini çağırmanız gerekir ."

"Ve başka?"

"Başka ne var? Oh! Arabellek Writer'a yazılmadığı sürece veriler silinebilir ve/veya değiştirilebilir."

"Amigo! Etkilendim! Sen bir uzmansın! Pekala, o zaman sana bazı yeni sınıflardan bahsedeceğim:  ByteArrayStream ve PrintStream ."

"Örneğin, ByteArrayInputStream ve ByteArrayOutputStream ."

"Bu sınıflar biraz StringReader ve StringWriter gibidir . Ancak StringReader bir dizeden ( char ) karakterleri okur , ancak InputStream bir bayt dizisinden ( ByteArray ) bayt okur."

StringWriter karakterleri ( char ) bir dizgeye yazarken, ByteArrayOutputStream baytları dahili bir bayt dizisine yazar. Bir StringWriter öğesine yazdığınızda , dahili dizesi uzar ve bir ByteArrayOutputStream öğesine yazdığınızda, dahili bayt dizisi de dinamik olarak genişler.

"Geçen derste size verilen örneği hatırlayın:"

Okuyucu nesnesinden okuma ve yazar nesnesine yazma:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 StringReader reader = new StringReader(test);

 StringWriter writer = new StringWriter();

 executor(reader, writer);

 String result = writer.toString();

 System.out.println("Result: "+ result);
}

public static void executor(Reader reader, Writer writer) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
 String line;
 while ((line = br.readLine()) != null) {
 StringBuilder sb = new StringBuilder(line);
 String newLine = sb.reverse().toString();

 writer.write(newLine);
 }
}

"Karakter yerine bayt kullanarak çalışsaydı şöyle görünürdü:"

Bir InputStream nesnesinden okuma ve bir OutputStream nesnesine yazma:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 InputStream inputStream = new ByteArrayInputStream(test.getBytes());

 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

 executor(inputStream, outputStream);

 String result = new String(outputStream.toByteArray());
 System.out.println("Result: "+ result);
}

public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception
{
 BufferedInputStream bis = new BufferedInputStream(inputStream);
 while (bis.available() > 0)
 {
  int data = bis.read();
  outputStream.write(data);
 }
}

"Her şey yukarıdaki örnektekiyle aynı. Ancak, String'i ByteArray ile, Reader'ı InputStream ile ve Writer'ı OutputStream ile değiştirdik."

"Diğer iki adım, String'i bir ByteArray'e dönüştürmek ve tekrar geri almak. Gördüğünüz gibi, bu oldukça kolay bir şekilde yapılıyor:"

Bir Dizeyi bir ByteArray'e ve tekrar geri dönüştürme
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 byte[] array = test.getBytes();

 String result = new String(array);
 System.out.println("Result: "+ result);
}

"Bir ByteArrayOutputStream'e zaten eklenmiş olan baytları almak için toByteArray () yöntemini çağırın."

"Ah. StringReader/StringWriter ile olan benzerlikler oldukça güçlü, özellikle de onları bana gösterdikten sonra. Gerçekten ilginç bir ders için teşekkürler Ellie."

"Bu kadar aceleyle nereye gidiyorsun? Sana hâlâ küçük bir hediyem var. Sana PrintStream dersinden bahsetmek istiyorum."

"PrintStream? Bu sınıfı ilk kez duyuyorum."

"Evet. Özellikle Java çalışmalarınızın ilk gününden beri kullandığınız gerçeğini saymazsak. System.out'u hatırlıyor musunuz ? Şey, System.out, System.out'un statik (sınıf) bir değişkenidir. class ve onun türü... PrintStream ! Tüm bu print, println, vb. yöntemlerin kaynaklandığı yer burasıdır."

"Vay canına. Ne kadar ilginç. Nedense bunu hiç düşünmemiştim. Bana daha fazlasını anlat."

"Güzel. Tamam, dinle. PrintStream sınıfı okunabilir çıktılar için icat edildi. Neredeyse tamamen print ve println yöntemlerinden oluşuyor. Şu tabloya bak:"

Yöntemler Yöntemler
void print(boolean b) void println(boolean b)
void print(char c) void println(char c)
void print(int c) void println(int c)
void print(long c) void println(long c)
void print(float c) void println(float c)
void print(double c) void println(double c)
void print(char[] c) void println(char[] c)
void print(String c) void println(String c)
void print(Object obj) void println(Object obj)
void println()
PrintStream format (String format, Object ... args)
PrintStream format (Locale l, String format, Object ... args)

"Ayrıca, bir biçim dizesi kullanarak veri çıktısı alabilmeniz için birkaç biçim yöntemi vardır. Örneğin:"

Bir Dizeyi bir ByteArray'e ve tekrar geri dönüştürme
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
Ekran çıkışı:
My name is Kolan. My age is 25.

"Evet, hatırlıyorum. String sınıfının format yöntemini zaten incelemiştik."

"Şimdilik bu kadar."

"Teşekkürler Ellie."