1. InputStreamReader
sınıf
Akışların bir başka ilginç özelliği de birden çok akışı zincirler halinde birleştirebilmenizdir . Bir akış, verileri yalnızca dahili veri kaynağından değil, aynı zamanda başka bir akıştan da okuyabilir .
Bu, Java'da bir akışı diğerine bağlayarak karmaşık veri okuma senaryoları oluşturmayı mümkün kılan çok güçlü bir mekanizmadır. Böyle bir şema şöyle görünür:
Bir program bir veri akışından veri okuduğunda, veri akışı da örneğin başka bir veri akışı veya bir dosya olan veri kaynağından verileri okur.
Dahası, her veri akışı yalnızca verileri okuyup vermekle kalmaz, aynı zamanda onu dönüştürebilir veya üzerinde çeşitli işlemler gerçekleştirebilir. Böyle bir "ara akışa" iyi bir örnek, sınıftır InputStreamReader
.
Adında bir sınıfı zaten biliyoruz FileReader
- bu, Reader
bir dosyadan veri okuyan bir sınıftır. Ve InputStreamReader
verilerini nereden alıyor? Bu doğru - bir InputStream
.
Bir nesne oluşturduğunuzda , bir nesneyi veya onun alt sınıflarından birini InputStreamReader
geçirmeniz gerekir . InputStream
Örnek:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
Sınıf , sınıfın sahip olduğu InputStreamReader
tüm yöntemlere sahiptir Reader
ve tamamen aynı şekilde çalışırlar.
InputStreamReader
Sınıf ve diyelim ki arasındaki temel fark , FileReader
verileri nereden okuduklarıdır. FileReader
bir dosyadan veri okur (hah - bu yüzden buna denir FileReader
), ancak InputStreamReader
bir InputStream
.
FileReader
Yöntemi kullanarak bir nesneden bir karakter okuduğunuzda read()
, sırayla diskteki dosyadan iki bayt okur ve bunları chars
.
InputStreamReader
Yöntemi kullanarak bir nesneden bir karakter okuduğunuzda read()
, sırayla FileInputStream
kendisine iletilen nesneden iki bayt okur ve bu da dosyadan veri okur. Sonuç, yöntemlere yapılan bir çağrı zinciridirread()
.
2. BufferedReader
sınıf
Muhtemelen çokça kullanacağınız bir başka ilginç sınıf da BufferedReader
. Bu aynı zamanda başka bir akıştan veri okuyan bir "ara akıştır".
Adından da anlaşılacağı gibi, BufferedReader
sınıf bir alt sınıftır Reader
ve karakterleri okumanıza izin verir . Ancak en ilginç olanı, ona ayrıca karakterlerin okunabileceği bir akış biçiminde , yani sınıfı miras alan bir akış biçiminde bir veri kaynağı aktarmanız gerekmesidir Reader
.
Amaç ne? sınıfından farklı olarak InputStreamReader
, BufferedReader
sınıf baytları karakterlere dönüştürmez: hiçbir şeyi dönüştürmez. Bunun yerine, verileri arabelleğe alır .
Bir program bir nesneden tek bir karakter okuduğunda BufferedReader
, nesne kaynak akışından büyük bir karakter dizisini aynı anda okur. Ve bunları dahili olarak saklar.
Nesneden bir sonraki karakter okunduğunda BufferedReader
, bir sonraki karakteri dahili arabellek dizisinden alır ve veri kaynağına erişmeden onu döndürür. Yalnızca arabellekteki tüm karakterler kullanıldığında, başka bir büyük karakter dizisini okur.
Sınıfın ayrıca kaynak akıştaki tüm veri dizilerini bir kerede okumanıza izin veren BufferedReader
çok kullanışlı bir yöntemi vardır — . String readLine()
Bu yöntemi, örneğin bir dosyayı okumak ve içeriğini ekranda satır satır görüntülemek için kullanabilirsiniz. Örnek:
Bunun ne kadar uygun olabileceğini göstermek için özel olarak bazı kompakt kodlar yazdık. Bu kod biraz daha detaylı olarak da yazılabilir.
|
Bir nesne oluşturun FileReader . Veri kaynağı bir dosyadır. Bir nesne oluşturun BufferedReader . Veri kaynağı bir FileReader . Okuyucuda hala veri olduğu sürece Bir satır oku Satırı göster |
Birden çok akışı birbirine zincirlerseniz, yöntemin close()
yalnızca bunlardan birinde çağrılması gerekir. Bu akış, yöntemi veri kaynağında arayacak ve close()
son veri akışında çağrılana kadar böyle devam edecek.
3. Konsoldan okuma
Ve bir ilginç gerçek daha: Scanner
sınıf, aynı zamanda bir veri akışı olan , 'dan verileri okuyan bir ara girdi akışından başka bir şey değildir System.in
.
Konsoldan bir satırı okumanın iki yolu:
Tarayıcı sınıfı | BufferedReader ve BufferedWriter sınıfları |
---|---|
|
|
Arkadaşımız, sınıfın statik bir değişkeninden başka bir şey değildir . Bu kimin adıdır .System.in
in
System
InputStream
in
CodeGym'deki Java çalışmalarınızın neredeyse en başından beri, veri akışlarıyla çalışıyor ve onlardan zincirler oluşturuyorsunuz. Ama artık bunu daha bilinçli yapacaksın.