2010-11-01 31 views
96

Tôi có một số trình lắng nghe đầu ra đang triển khai OutputStream. Nó có thể là một PrintStream viết để stdout hoặc một tập tin, hoặc nó có thể được ghi vào bộ nhớ hoặc bất kỳ điểm đến đầu ra khác; do đó, tôi đã chỉ định OutputStream làm đối số (an) trong phương thức.Viết chuỗi vào luồng đầu ra

Bây giờ, tôi đã nhận được Chuỗi. Cách tốt nhất để ghi vào luồng ở đây là gì?

Tôi có nên sử dụng Writer.write (message.getBytes()) không? Tôi có thể cung cấp cho nó byte, nhưng nếu dòng đích là một dòng ký tự thì nó sẽ tự động chuyển đổi?

Tôi có cần sử dụng một số luồng cầu tại đây không?

+1

Tôi không chắc chắn nhưng điều này có vẻ như bạn đang cố gắng phát minh lại bánh xe ở đây, bạn đã xem qua J chưa API cơ sở ava, cũng như API giao diện IO? – posdef

Trả lời

118

Streams (InputStreamOutputStream) chuyển nhị phân dữ liệu. Nếu bạn muốn viết chuỗi vào luồng, trước tiên bạn phải chuyển chuỗi đó thành byte hoặc nói cách khác là mã hóa. Bạn có thể thực hiện điều đó theo cách thủ công (như bạn đề xuất) bằng cách sử dụng phương thức String.getBytes(Charset), nhưng bạn nên tránh phương thức String.getBytes(), vì phương pháp này sử dụng mã hóa mặc định của JVM, không thể dự đoán được một cách đáng tin cậy theo cách di động.

Cách thông thường để ghi dữ liệu nhân vật để một dòng suối, tuy nhiên, là để bọc các dòng trong một Writer, (thường là một PrintWriter), mà không được chuyển đổi cho bạn khi bạn gọi phương thức của nó write(String) (hoặc print(String)). Trình bao bọc tương ứng cho InputStreams là Reader.

PrintStream là triển khai OutputStream đặc biệt theo nghĩa là nó cũng chứa các phương thức tự động mã hóa chuỗi (nó sử dụng một người viết nội bộ). Nhưng nó vẫn là một dòng suối. Bạn có thể an toàn kết nối luồng của mình với một người viết bất kể đó có phải là PrintStream hoặc một số triển khai luồng khác không. Không có nguy cơ mã hóa kép.

Ví dụ về PrintWriter với OutputStream:

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

Wrap OutputStream của bạn bằng PrintWriter và sử dụng phương thức in trên lớp đó. Họ lấy một String và làm công việc cho bạn.

29

Bạn có thể tạo một gói PrintStream xung quanh OutputStream của bạn và sau đó chỉ cần gọi nó là in (String):

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

Bộ ký tự nào là PrintStream sử dụng để chuyển đổi thành byte? –

73

OutputStream viết byte, String cung cấp chars. Bạn cần phải xác định Charset để mã hóa chuỗi thành byte []:

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

Thay đổi UTF-8 thành bộ ký tự bạn chọn.

+0

Nối với dòng sau. 'ByteArrayOutputStream outputStream = new ByteArrayOutputStream();' –

11

By design nó là để được thực hiện theo cách này:

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

Lưu ý rằng 'w.close()' cũng sẽ đóng 'out'. –

Các vấn đề liên quan