1. OutputStreamsınıf

Yakın zamanda giriş akışlarını araştırdık. Çıkış akışları hakkında konuşmanın zamanı geldi.

Sınıf OutputStream, bayt çıktısını destekleyen tüm sınıflar için üst sınıftır. Bu, kendi başına hiçbir şey yapmayan soyut bir sınıftır, ancak her durum için alt sınıfları vardır.

Kulağa son derece karmaşık geliyor. Daha basit bir şekilde ifade etmek gerekirse, bu sınıf, örneğin karakterler veya diğer veri türleri üzerinde değil, baytlar üzerinde çalışır. Ve soyut olduğu gerçeği, genellikle onu kullanmadığımız, onun soyundan gelen sınıflardan birini kullandığımız anlamına gelir. Örneğin FileOutputStreamve benzerleri.

Ama sınıfa geri dönelim OutputStream. Bu sınıf, tüm alt sınıflarının uygulaması gereken yöntemlere sahiptir. İşte ana olanlar:

Yöntemler Tanım
void write(int b)
intAkışa bir bayt ( değil) yazar .
void write(byte[] buffer)
Akışa bir dizi bayt yazar
void write(byte[] buffer, off, len)
Bir bayt dizisinin bir kısmını akışa yazar
void flush()
Tamponda depolanan tüm verileri akışa yazar
void close()
Akışı kapatır

Miras alan bir sınıftan bir nesne oluşturduğunuzda InputStream, genellikle verilerin okunacağı bir kaynak nesne belirtirsiniz InputStream. Miras alan bir sınıftan bir nesne oluşturduğunuzda OutputStream, genellikle verilerin yazılacağı hedef nesneyi veya akışı da belirtirsiniz.

Sınıfın tüm metotlarını kısaca gözden geçirelim OutputStream:

write(int b)yöntem

intBu yöntem , çıktı akışına bir bayt (bir değil) yazar . Geçirilen değer bir bayta dönüştürülür ve int'nin ilk üç baytı atılır.

write(byte[] buffer)yöntem

Verilen bayt dizisini çıkış akışına yazar. Bu kadar.

write(byte[] buffer, int offset, int length)yöntem

Geçirilen bayt dizisinin bir bölümünü çıkış akışına yazar. Ofset değişkeni, dizinin ilk elemanının indeksini gösterir ve lengthyazılacak altkümenin uzunluğudur.

flush()yöntem

Yöntem flush(), geçerli akışta potansiyel olarak tamponlanmış herhangi bir veriyi hedef akışa yazılmaya zorlamak için kullanılır. Bu, ara belleğe alma ve/veya zincir halinde düzenlenmiş çoklu akış nesneleri kullanıldığında geçerlidir.

close()yöntem

Yazılmamış verileri hedef nesneye yazar. close()Bir blok kullanırsanız yöntemin çağrılması gerekmez try-with-resources.

Dosya kopyalama örneği

kod Not
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreambir dosyadan okumak için
OutputStreambir dosyaya yazmak için

İçine verileri okuyacağımız arabellek
Akışta veri olduğu sürece verileri

arabelleğe oku
Verileri arabellekten ikinci akışa yaz

2. Writersınıf

Sınıf Writer, sınıfla tamamen aynıdır OutputStream, ancak yine bir fark vardır: charbayt yerine karakterlerle ( ) çalışır.

Bu soyut bir sınıftır: sınıfın nesnelerini oluşturamazsınız Writer. Ana hedefi, yüzlerce alt sınıf için ortak bir üst sınıf olmak ve onlara karakter akışlarıyla çalışmak için ortak yöntemler vermektir.

Sınıfın yöntemleri Writer(ve onun soyundan gelen tüm sınıflar):

Yöntemler Tanım
void write(int b)
intAkışa bir karakter (bir değil) yazar .
void write(char[] buffer)
Akışa bir dizi karakter yazar
void write(char[] buffer, off, len)
Bir karakter dizisinin bir kısmını akışa yazar
void write(String str)
Akışa bir dize yazar
void write(String str, off, len)
Dizinin bir bölümünü akışa yazar
void flush()
Tamponda depolanan tüm verileri akışa yazar
void close()
Akışı kapatır

Yöntemler, sınıfın yöntemlerine çok benzer OutputStream, ancak bayt yerine karakterlerle çalışırlar.

Yöntemlerin açıklaması:

write(int b)yöntem

Bu yöntem, çıktı akışına tek bir karakter ( char— değil ) yazar. intGeçirilen değer a'ya dönüştürülür charve ilk iki bayt atılır.

write(char[] buffer)yöntem

Verilen karakter dizisini çıkış akışına yazar.

write(char[] buffer, int offset, int length)yöntem

Geçirilen karakter dizisinin bir bölümünü çıkış akışına yazar. Değişken offset, dizinin ilk elemanının indeksini gösterir ve lengthyazılacak altkümenin uzunluğudur.

write(String str)yöntem

Verilen dizeyi çıkış akışına yazar.

write(String str, int offset, int length)yöntem

Verilen dizgenin bir bölümünü çıkış akımına yazar: dizge bir karakter dizisine dönüştürülür. Değişken offset, dizinin ilk elemanının indeksini gösterir ve lengthyazılacak altkümenin uzunluğudur.

flush()yöntem

Yöntem flush(), geçerli akışta potansiyel olarak tamponlanmış herhangi bir veriyi hedef akışa yazılmaya zorlamak için kullanılır. Bu, ara belleğe alma ve/veya zincir halinde düzenlenmiş çoklu akış nesneleri kullanıldığında geçerlidir.

close()yöntem

Yazılmamış verileri hedef nesneye yazar. close()Bir blok kullanırsanız yöntemin çağrılması gerekmez try-with-resources.

Bir metin dosyasını kopyalayan bir program örneği:

kod Not
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerbir dosyadan okumak
Writeriçin bir dosyaya yazmak için

İçine verileri okuyacağımız arabellek
Akışta veri olduğu sürece verileri

bir arabelleğe oku
Verileri arabellekten ikinci akışa yaz

StringWritersınıf

Sınıfı devralan başka bir ilginç sınıf daha var Writer: adı StringWriter. Değişken bir dize içerir - bir StringBuffernesne. Ve nesneye bir şey "yazdığınız" her seferde StringWriter, metin yalnızca dahili arabelleğine eklenir.

Örnek:

kod Not
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
Bir hedef karakter akışı ( StringWriter) oluşturulur.
Bir dize, içindeki arabelleğe yazılır. StringWriter
Bir dize, içindeki arabelleğe yazılır. StringWriter

Bir nesnenin içeriğini bir dizeye dönüştürme

Bu durumda, StringWritersınıf aslında sınıfın üzerinde bir sarmalayıcıdır StringBuffer, ancak StringWritersınıf, akış sınıfının soyundan gelir Writerve akış nesnelerinin zincirlerinde kullanılabilir. Bu pratikte oldukça kullanışlı bir özelliktir.



3. PrintStreamsınıf

Çıkış akışı sınıfları, kendilerine iletilen hedef akışa veri yazan aracı akışlarla bir zincire de yerleştirilebilir. Bu akışların etkileşiminin genel görünümü şöyle görünür:

Baskı Akışı sınıfı

Tüm ara çıktı akışlarının en ilginç ve çok yönlü olanı PrintStream. Onlarca metodu ve 12 adede kadar yapıcısı vardır.

Sınıf , . PrintStream_ Bu, sınıfın kendi yöntemlerine ek olarak üst sınıfların tüm yöntemlerine sahip olduğu anlamına gelir . İşte en ilginç olanlar:FilterOutputStreamOutputStreamPrintStream

Yöntemler Tanım
void print(obj)
Geçirilen nesneyi bir dizgeye dönüştürür ve onu hedef akışa verir.
void println(obj)
Geçirilen nesneyi bir dizgeye dönüştürür ve onu hedef akışa verir. Sonuna bir satır sonu ekler
void println()
Hedef akışa bir satır sonu karakteri verir
PrintStream format(String format, args...)
Biçim dizesine ve iletilen bağımsız değişkenlere dayalı olarak bir dize oluşturur ve çıktı verir; String.format()yönteme benzer

Peki bu onlarca yöntem nerede diye soruyorsunuz?

print()Pekala, farklı parametrelere sahip ve yöntemlerinin birçok çeşidi vardır println(). Bu tabloda özetlenebilirler.

Bu yöntemlerin ayrıntılarına girmeyeceğiz çünkü onları zaten iyi biliyorsunuz. Neye vardığımı tahmin edebilir misin?

Hatırladın mı System.out.println()? Ancak iki satırda yazılabilir:

kod Konsol çıkışı
PrintStream stream = System.out;
stream.println("Hello!");
Hello!

En sevdiğimiz komut, sınıfın statik değişkenindeki yönteme yapılan çağrıdır . Ve bu değişkenin türü .System.out.println()println()outSystemPrintStream

PrintStreamPek çok CodeGym seviyesinde ve hemen hemen her görevde, sınıfın yöntemlerini bilmeden çağırıyorsunuz !

Pratik kullanım

ByteArrayOutputStreamJava , miras alan dinamik olarak büyüyen bir bayt dizisi olan bu ilginç sınıfa sahiptir OutputStream.

Bir ByteArrayOutputStreamnesne ve PrintStreamnesne şu şekilde zincirlenebilir:

kod Tanım
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try(PrintStream stream = new PrintStream(baos))
{
   stream.println("Hello");
   stream.println(123);
}

String result = baos.toString();

System.out.println(result);
Bellekte bir yazma tamponu oluşturun

Tamponu bir PrintStreamnesneye sarın

Konsola veri yazın



Diziyi bir dizgeye dönüştürün!

Konsol çıktısı:
Hello!
123