"Merhaba Amigo! Bugün giriş/çıkış akışlarını tanıyacağız . Bu konuyu birkaç gün önce seçtik ama bugün iyice inceleyeceğiz. Giriş/çıkış akışları 4 kategoriye ayrılır:"

1) Akışlar yönlerine göre ayrılır: giriş akışları ve çıkış akışları

2) Akışlar, veri türlerine göre ayrılır: baytlarla çalışanlar ve karakterlerle çalışanlar .

Burada bu bölümler bir tabloda temsil edilmektedir:

Giriş akışı Çıkış akışı
Baytlarla çalışır Giriş Akışı Çıkış Akışı
Karakterlerle çalışır Okuyucu yazar

Bir nesne, InputStream arabirimini uygularsa , ondan baytları sırayla okuma yeteneğini destekler.

Bir nesne, OutputStream arabirimini uygularsa , ona sırayla bayt yazma yeteneğini destekler.

Bir nesne Reader arayüzünü uygularsa , ondan karakterleri (karakterleri) sırayla okuma yeteneğini destekler.

Bir nesne Writer arayüzünü uygularsa , ona sırayla karakter (karakter) yazma yeteneğini destekler.

Giriş/Çıkış akışları - 1

Çıkış akışı bir yazıcı gibidir. Belgeleri yazıcıya yazdırabiliriz. Verileri bir çıktı akışına verebiliriz.

Kendi adına, bir giriş akışı bir tarayıcıya veya belki de bir elektrik prizine benzetilebilir. Bir tarayıcı ile belgeleri bilgisayarımıza getirebiliriz. Veya bir elektrik prizine takıp elektrik alabiliriz. Bir giriş akışından veri alabiliriz.

"Nerede kullanılıyorlar?"

"Bu sınıflar Java'nın her yerinde kullanılır . Tanıdık dostumuz System.in, System sınıfında adlı statik bir InputStream değişkenidir ."

"Cidden mi?! Bunca zamandır bir InputStream kullanıyorum ve bunun farkına bile varmadım. System.out da bir akış mı?"

"Evet, System.out, System sınıfındaki statik bir PrintStream ( ÇıktıStream öğesinin soyundan gelen) bir değişkendir."

"Yani bana her zaman akışları kullandığımı ve bunu bilmediğimi mi söylemek istiyorsun?"

"Evet ve bu da bize bu akışların ne kadar kullanışlı olduğunu gösteriyor. Bir tane alıp kullanıyorsunuz."

"Ama bunu System.in için söyleyemezsiniz. Ona sürekli BufferedReader veya InputStreamReader eklemek zorunda kaldık."

"Bu doğru. Ama bunun için de sebepler vardı."

Pek çok veri türü ve bunlarla çalışmanın birçok yolu vardır. Böylece, her şeyi neredeyse aynı şekilde yapmalarına rağmen, standart G/Ç sınıflarının sayısı çok hızlı arttı. Bu karmaşıklıktan kaçınmak için Java geliştiricileri, soyutlama ilkesini kullandılar ve sınıfları birçok küçük parçaya ayırdılar.

Ancak bu parçaları tutarlı bir şekilde bağlayabilir ve ihtiyacınız varsa çok karmaşık işlevsellik elde edebilirsiniz. Şu örneğe bakın:

Konsola bir dize çıktısı
System.out.println("Hello");
Konsol çıkış akışını ayrı bir değişkende saklayın.
Akışa bir dize çıktısı verin.
PrintStream console = System.out;
console.println("Hello");
Bellekte dinamik (genişleyen) bir bayt dizisi oluşturun.
Bunu yeni bir çıktı akışına (PrintStream nesnesi) bağlayın.
Akışa bir dize çıktısı verin.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"Dürüst olmak gerekirse, bu bir Lego seti gibi. Ancak bu kodların herhangi birinin ne yaptığı benim için net değil."

"Şimdilik bunun için endişelenme. Her şeyin zamanı gelince."

Hatırlamanızı istediğim şey şu: Bir sınıf, OutputStream arabirimini uygularsa, ona bayt yazabilirsiniz. Verileri konsola çıkardığınız gibi. Onunla ne yaptığı onun işi. "Lego kitimiz" ile her bir parçanın amacını umursamıyoruz. Geniş parça yelpazesinin bu kadar harika şeyler yapmamıza izin verdiği gerçeğini önemsiyoruz.

"Tamam. O zaman nereden başlayalım?"