"Merhaba Amigo! Şimdi size iki arayüzden bahsedeceğim: InputStream ve OutputStream . Bunlar soyut sınıflar olarak bildirilirler, ancak daha derine inerseniz aslında arayüz olduklarını görebilirsiniz . Yöntemlerinin neredeyse tamamı soyuttur. birkaç önemsiz yöntem Daha önce düşündüğümüz " koruma " ya çok benziyorlar ."

Bunlar çok ilginç arayüzler. Şimdilik onlara kasıtlı olarak arayüzler diyeceğim , böylece onlara neden ihtiyacımız olduğunu anlayacaksınız. Ve sonra neden aslında soyut sınıflar oldukları hakkında konuşacağız.

"Tamam. Peki nedir bu arayüzler?"

"Daha fazla uzatmadan anlatacağım."

Java'da « akış » adı verilen ilginç bir şey vardır. Akış çok basit bir varlıktır. Ve basitliği, veri alışverişinde bulunmanın çok güçlü bir yolunun anahtarıdır. İki tür akış vardır: okuma akışları ve yazma akışları .

Muhtemelen zaten tahmin ettiğiniz gibi, yazmak için bir akışa veri yazabilirsiniz . Bunun için bir yazma yöntemi vardır . Okumak için bir akıştan veri okuyabilirsiniz . Bunun için bir read () yöntemi vardır .

InputStream  , okumayı destekleyen bir akışın arayüzüdür. Aşağıdaki yeteneği tanımlar: «baytlar benden okunabilir».

Benzer şekilde, bir OutputStream olan OutputStream, yazmayı destekleyen bir akış için bir arabirimdir. Aşağıdaki yeteneği tanımlar: «baytlar bana yazılabilir».

"Bu kadar?"

"Hemen hemen. Ama bütün mesele şu ki, Java'nın InputStream ve OutputStream ile çalışabilen bir sürü sınıfı var . Örneğin, diskten bir dosya okumak ve içeriğini ekranda görüntülemek istiyorsunuz. Hiçbir şey daha kolay olamaz."

Diskteki bir dosyadan veri okumak için, InputStream arayüzünü uygulayan özel FileInputStream sınıfına sahibiz . Bu verileri başka bir dosyaya yazmak istiyor musunuz? Bunun için, OutputStream arabirimini uygulayan FileOutputStream sınıfına sahibiz . Aşağıdaki kod, verileri bir dosyadan diğerine kopyalamak için yapmanız gerekenleri gösterir.

kod
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one byte from the input stream
  outStream.write(data); //write that byte to the other stream.
 }

 inStream.close(); //close the streams
 outStream.close();
}

Bir sınıf yazdığımızı ve  ona InputStream  ve  OutputStream yeteneklerini eklediğimizi hayal edin.

Bu arayüzleri düzgün bir şekilde uygularsak, sınıfımızın örnekleri artık bir dosyaya kaydedilebilir veya bir dosyadan okunabilir. Basitçe okuma yöntemini kullanarak içeriklerini okuyarak . Veya bir nesne oluşturarak ve dosya içeriğini yazmak için write yöntemini kullanarak bir dosyadan yüklenebilirler .

"Belki bir örnek?"

"Elbette."

kod Tanım
class MyClass
{
private ArrayList<Integer> list;
}
Basit olması için, sınıfımızın bir nesne, Tamsayıları tutan bir ArrayList içerdiğini hayal edin.

Şimdi ona okuma ve yazma metodları ekleyeceğiz.

kod Tanım
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
Şimdi sınıfımız , list öğesinin tüm içeriğini sıralı olarak okumayı mümkün kılan read yöntemini uyguluyor .

Ve listemize değerler yazmanıza izin veren yazma yöntemi.

Elbette bu, InputStream ve OutputStream arabirimlerinin bir uygulaması değildir, ancak çok benzerdir.

"Evet, anlıyorum. Peki böyle bir nesnenin içeriğini bir dosyaya nasıl kaydedersiniz?"

"Sana bir örnek vereyim:"

Bir dosyaya MyClass nesnesi yazın
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //read one int from the input stream
  outStream.write(data); //write that int to the other stream.
 }

 outStream.close();
}
Bir dosyadan MyClass nesnesini okuyun
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one int from the input stream
  myObject.write(data); //write that int to the other stream.
 }

 inStream.close(); //close the streams
}

"Vay canına! Gerçekten de InputStream/OutputStream ile çalışmaya çok benziyor. Akışlar çok güzel!"

"Ve sonra biraz!"