Giriş-çıkış akışları (I/O streams), Java'nın en temel kavramlarından biridir ve dilin erken sürümleriyle birlikte ortaya çıkmıştır. Bu kavram, veri okuma ve yazma süreçlerinin soyutlanması amacıyla geliştirilmiştir: bir akış, bir dosya, ağ veya hatta bir konsol ile ilişkilendirilebilir — kod için bu durum aynı şekilde görünür.
Sorun , geliştiricinin akışları yanlış yönetmesi, akışları kapatmayı unutması veya farklı akış türlerini (karakter ve byte akışları) karıştırması durumunda ortaya çıkar; bu genellikle kaynak sızıntılarına, veri bozulmalarına veya çalışma zamanı hatalarına yol açar.
Çözüm — giriş-çıkış akışlarının hiyerarşisinin (byte'lar için InputStream/OutputStream, karakterler için Reader/Writer) doğru bir şekilde anlaşılması ve uygulanması, ayrıca işlemler tamamlandıktan sonra akışların kapatılmasının zorunlu hale getirilmesidir; bu, Java 7'den itibaren try-with-resources kullanılarak tercih edilir.
Dosya okuma ve yazma kodu örneği:
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt")); BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { String line; while ((line = reader.readLine()) != null) { writer.write(line); writer.newLine(); } }
Anahtar özellikler:
Java'da giriş-çıkış akışını kapatmazsan ne olur?
Akışlar, işletim sisteminin düşük seviyeli kaynaklarını işgal eder ve akışın kapatılmaması bellek sızıntılarına, dosyaların kilitlenmesine, uygulamanın çalışmasında aksaklıklara veya hatta işletim sistemi düzeyinde dosya tanımlayıcılarının tükenmesine neden olabilir.
Farklı dosyalara yazmak için aynı OutputStream'i kullanabilir miyim?
Hayır, klasik OutputStream bir veri kaynağı/alıcı ile sıkı bir şekilde ilişkilidir. Farklı dosyalar için farklı OutputStream nesneleri kullanılmalıdır.
PrintWriter ve BufferedWriter arasındaki fark nedir? Hangi durumda hangisi kullanılmalıdır?
PrintWriter, çıktı formatlama yöntemleri ile çıktıyı tamamlamaya odaklanır, örneğin println() ve otomatik sıfırlama özelliğine sahiptir. BufferedWriter ise esasen tamponlama yoluyla performansı artırmaktadır. Çoğu uygulama senaryosunda, PrintWriter metin çıktısı için tercih edilir; ancak sadece karakter veya dizeleri biçimlendirmeden hızlı bir şekilde yazmak gerekirse, BufferedWriter daha uygun olacaktır.
Geliştirici, FileInputStream kullanarak büyük bir dosyadan veri okur, tamponlama kullanmaz ve akışı kapatmayı unutur.
Artılar:
Eksiler:
BufferedReader ve try-with-resources kombinasyonu kullanılır; okuma ve işleme, satır bazında paketler halinde yapılır ve akış otomatik olarak kapanır.
Artılar:
Eksiler: