Çıkış akışına dize yazma


139

OutputStream uygulayan birkaç çıkış dinleyicim var. Stdout'a veya bir Dosyaya bir PrintStream yazısı olabilir veya belleğe veya başka bir çıktı hedefine yazılabilir; bu nedenle, yöntemde (an) argüman olarak OutputStream belirtildi.

Şimdi, String aldım. Burada akışlara yazmanın en iyi yolu nedir?

Sadece Writer.write (message.getBytes ()) kullanmalı mıyım? Bayt verebilirim, ancak hedef akış bir karakter akışı ise, otomatik olarak dönüşecek mi?

Bunun yerine burada bazı köprü akışları kullanmam gerekir mi?


2
Emin değilim ama buradaki tekerleği yeniden icat etmeye çalışıyormuşsunuz gibi geliyor, Java Base API'sına ve Commons IO API'sine baktınız mı?
posdef

Yanıtlar:


149

Akışlar ( InputStreamve OutputStream) ikili verileri aktarır . Bir akışa bir dize yazmak istiyorsanız, önce onu bayta dönüştürmeniz veya başka bir deyişle onu kodlamanız gerekir. Bunu String.getBytes(Charset)yöntemi kullanarak manuel olarak (önerdiğiniz gibi) yapabilirsiniz , ancak yöntemden kaçınmalısınız String.getBytes(), çünkü bu, taşınabilir bir şekilde güvenilir bir şekilde tahmin edilemeyen JVM'nin varsayılan kodlamasını kullanır.

Bir akışa karakter verileri yazmanın genel yolu, akışı, (veya ) yöntemini çağırdığınızda dönüştürme işlemini sizin için yapan bir Writer, (genellikle a ) içine sarmaktır. InputStreams için karşılık gelen sarıcı bir Reader'dır .PrintWriterwrite(String)print(String)

PrintStreamOutputStreamdizeleri otomatik olarak kodlayan yöntemler içerdiği için özel bir uygulamadır (dahili olarak bir yazar kullanır). Ama yine de bir dere. Bir PrintStreamakış uygulaması ya da başka bir akış uygulaması olursa olsun akışınızı bir yazarla güvenle sarabilirsiniz . Çift kodlama tehlikesi yoktur.

OutputStream özellikli PrintWriter örneği:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
    p.println("Hello");
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}

3
Yani kullanmak PrintWritertıpkı kullanmak gibidir String.getBytes(). JVM'nin varsayılanı olan rastgele kodlamayı kullanır. Bu yüzden sadece şanslıysanız işe yarar.
Christoffer Hammarström

106

OutputStream bayt yazar, String karakter sağlar. Dizeyi bayt [] olarak kodlamak için Karakter Kümesi tanımlamanız gerekir:

outputStream.write(string.getBytes(Charset.forName("UTF-8")));

Change UTF-8seçeceğiniz bir karakter kümesine.


3
Aşağıdaki satıra ekleyin. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Sahil Patel

32

OutputStream'inizin etrafında bir PrintStream sarma oluşturabilir ve daha sonra ona print (String) adını verebilirsiniz:

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();

2
PrintStream, bayta dönüştürmek için hangi karakter kümesini kullanıyor?
Dean Hiller

20

Tasarım gereği şu şekilde yapılmalıdır:

OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush

3
Bunun w.close()da kapanacağını unutmayın out.
Franklin Yu

12

OutputStream öğenizi bir PrintWriter ile sarın ve o sınıftaki yazdırma yöntemlerini kullanın. Onlar bir String almak ve sizin için işi.


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.