1. InputStreamReadersı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:

InputStreamReader sınıfı

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, Readerbir dosyadan veri okuyan bir sınıftır. Ve InputStreamReaderverilerini nereden alıyor? Bu doğru - bir InputStream.

Bir nesne oluşturduğunuzda , bir nesneyi veya onun alt sınıflarından birini InputStreamReadergeç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 InputStreamReadertüm yöntemlere sahiptir Readerve tamamen aynı şekilde çalışırlar.

InputStreamReaderSınıf ve diyelim ki arasındaki temel fark , FileReaderverileri nereden okuduklarıdır. FileReaderbir dosyadan veri okur (hah - bu yüzden buna denir FileReader), ancak InputStreamReaderbir InputStream.

FileReaderYöntemi kullanarak bir nesneden bir karakter okuduğunuzda read(), sırayla diskteki dosyadan iki bayt okur ve bunları chars.

InputStreamReaderYöntemi kullanarak bir nesneden bir karakter okuduğunuzda read(), sırayla FileInputStreamkendisine iletilen nesneden iki bayt okur ve bu da dosyadan veri okur. Sonuç, yöntemlere yapılan bir çağrı zinciridirread() .


2. BufferedReadersı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, BufferedReadersınıf bir alt sınıftır Readerve 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, BufferedReadersı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.

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}
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
Önemli bir nokta:

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: Scannersı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ı
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

Arkadaşımız, sınıfın statik bir değişkeninden başka bir şey değildir . Bu kimin adıdır .System.ininSystemInputStreamin

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.