Java: PrintStream ve PrintWriter arasındaki fark


125

Arasındaki fark nedir PrintStreamve PrintWriter? Bu iki sınıfı karıştırdığım için birçok ortak yöntemi var. Üstelik onları tamamen aynı şeyler için kullanabileceğimizi düşünüyorum. Ama bir fark olmalı, aksi takdirde sadece bir sınıf olurdu.

Arşivleri araştırdım ancak bu soruyu bulamadım.


1
+1 Güzel soru, ben de bu iki sınıfı karıştırıyorum ve API dokümanı da pek yardımcı olmuyor.
helpermethod

Diğer bir fark, autoflush'un nasıl çalıştığıdır. Bir yazar için çıktıda \ n karakterinin varlığı flush () 'u tetikler. Ancak bir bayt akışında (PrintStream) yalnızca bayt vardır. autoflush daha sonra Javadoc'ta açıklandığı gibi çalışır, "satırsonu karakteri yerine platformun kendi satır ayırıcısı kavramı".
dakika

Yanıtlar:


129

Bu ciddiyetsiz, ama gelebilir PrintStreambir karşı baskılar OutputStreamve PrintWriterbir karşı baskılar Writer. Tamam, bariz olanı ifade ettiğim için herhangi bir puan alacağımdan şüpheliyim. Ama dahası var.

Öyleyse, an OutputStreamve a arasındaki fark Writernedir? Her ikisi de akışlardır, birincil fark a OutputStreambir bayt akışı iken a Writerbir karakter akışıdır.

Bir OutputStreambayt ile ilgileniyorsa, ne olacak PrintStream.print(String)? Varsayılan platform kodlamasını kullanarak karakterleri bayta dönüştürür. Varsayılan kodlamayı kullanmak genellikle kötü bir şeydir, çünkü bir platformdan diğerine geçerken hatalara yol açabilir, özellikle de dosyayı bir platformda oluşturuyor ve başka bir platformda kullanıyorsanız.

A ile Writer, herhangi bir platform bağımlılığından kaçınarak, genellikle kullanılacak kodlamayı belirtirsiniz.

PrintStreamBirincil amaç baytlar değil de karakterler yazmak olduğuna göre, JDK'da neden bir tane olması zahmetine girsin? PrintStreamOkuyucu / Yazar karakter akışları sunulduğunda JDK 1.1'den öncedir. Sun'ın, PrintStreamyalnızca bu kadar yaygın olarak kullanıldığı gerçeğinden ötürü vazgeçeceğini hayal ediyorum . (Sonuçta, her çağrıyı istemem System.outgelen türünü değiştirerek, aynı zamanda! Kaldırılmış bir API uyarı oluşturmak için PrintStreamiçin PrintWritermevcut uygulamaları kırık olurdu standart çıkış akışlarında.)


3
Ben de öyle düşünmüştüm - ama bu doğru değil. PrintStream bile başlık altında bir Yazar tutar - onu bir OutputStream geçirirseniz, onu sarar.
Jon Skeet

3
@Jon - dahili olarak bir Yazar vardır, ancak bir OutputStream'e yazar, dolayısıyla net etki bir PrintStream'in bir OutputStream'e yazmasıdır - char'dan bayta dönüştürme gerçekleşir ve varsayılan platform kodlamasını kullanır. Bir PrintWriter'da karakter bayt dönüşümü için böyle bir gereklilik yoktur, sonuna kadar karakterlerle kalabilirsiniz.
mdma

"Varsayılan karakter kümesi, sanal makine başlatılırken belirlenir ve tipik olarak temeldeki işletim sisteminin yerel ayarına ve karakter kümesine bağlıdır.", Ayrıca Yerel Ayar bazı platformlarda varsayılan karakter kümesini değiştirir.
Pindatjuh

7
Java 1.5'ten bu yana PrintStream, platform varsayılan kodlamasını kullanmakla sınırlı değildir; karakter kümesi adını kabul eden kurucular vardır. Böylece ayrımlar arasında PrintStreamve PrintWriterbir o vardır PrintWriterham bayt yazamazsınız ve iki sınıfları yerlerinden farklı sarın.
Ted Hopp

1
Onlar etkili bir arayüz ise ortak Aynı, aynı zamanda davranışlarında önemli bir fark kayda değer olabilir PrintStream'ın print()yöntemleri çağrı kolaylık fonksiyonları write()etkinse gibi onlar AutoFlush tetikleyebilir. PrintWriterdiğer yandan, bir çağrıdan sonra otomatik olarak yıkanmaz print(). Bugün bazı başlangıç ​​seviyelerine Java'yı gösteriyorum ve bu, elle yıkama ihtiyacına aşina olmayan bazı öğrencilerin dikkatini çekiyordu. Aksi takdirde cevabınız harika.
Robadob

61

İle PrintStreamplatformun varsayılan kodlamasına bağlı kaldınız.

PrintStream stream = new PrintStream(output);

İle PrintWritersen ancak bir geçebilir OutputStreamWriterbelirli kodlama.

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

Bunun avantajı, karakter kodlamasını kontrol edebilmenizdir, karakterlerin sonunda mojibake olarak sonlanmayacak şekilde yazılması gerekir .


12
PrintStream(OutputStream out, boolean autoFlush, String encoding)
1.4'ten beri

19

JDK 1.4'ten beri, bir Baskı Akışı için karakter kodlamasını belirtmek mümkündür. Bu nedenle, PrintStream ve PrintWriter arasındaki farklar yalnızca otomatik temizleme davranışı ile ilgilidir ve bir PrintStream bir Writer'ı saramaz.


3

PrintWriter gibi yazarlar metin çıkışı içindir, akışlar ikili çıktı içindir. Yazarlar sizin için karakter seti işlerini halleder. Akışlar, bu tür bir dönüşümü istemediğiniz varsayıldığı için değil, bu ikili verilerinizi bozar ve eğer yaparsanız bir yazar kullanır.


1
PrintStream dışında, çünkü bu kodlama alır, böylece standart bir OutputStream'den biraz daha fazlasını işleyebilir.
Simon Groenewolt

Tek amacı dizeleri yazdırmak olan System.out'un aslında bir PrintStream olması garip geliyor.
dakika

"Yazarlar sizin için karakter seti işlerini halleder" - sadece karakterleri bayta dönüştürmekle ilgilenen Yazarlar. Tüm Yazarlar bunu yapmaz.
Aivar

2

Bir Yazara değil Akışa işlenmemiş baytlar yazabilirsiniz. PrintWriter javadoc listeleri diğer farklar (en önemlisi, derdim ham bayt yorumlayabilir, böylece bir akım üzerindeki bir kodlamasını ayarlamak mümkün).


PrintStream ile kodlama da belirtilebilir
Aivar

1

gelen çekirdek java Horstmann tarafından

Java uzmanları PrintStream sınıfına ve System.out'a ne olduğunu merak edebilir. Java 1.0'da PrintStream sınıfı, üst baytı bırakarak tüm Unicode karakterlerini ASCII karakterlerine kısalttı. (O zamanlar Unicode hala 16 bitlik bir kodlamaydı.) Açıkçası, bu temiz veya taşınabilir bir yaklaşım değildi ve Java 1.1'de okuyucuların ve yazarların tanıtımıyla düzeltildi. Mevcut kodla uyumluluk için System.in, System.out ve System.err, okuyucular ve yazarlar değil, yine de giriş / çıkış akışlarıdır. Ancak artık PrintStream sınıfı, Unicode karakterlerini PrintWriter'ın yaptığı gibi dahili olarak varsayılan ana bilgisayar kodlamasına dönüştürür. PrintStream türü nesneler, print ve println yöntemlerini kullandığınızda tıpkı yazıcı yazarları gibi davranır,


-3

Printwriter, baskı akışının bir geliştirmesidir.

Belirli bir amaç için IE baskı akışı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.