Java: PrintStream thành chuỗi?


115

Tôi có một hàm lấy một đối tượng thuộc một loại nhất định và một PrintStreamđối tượng để in và xuất ra một biểu diễn của đối tượng đó. Làm cách nào để nắm bắt đầu ra của hàm này trong một chuỗi? Cụ thể, tôi muốn sử dụng nó như trong một toStringphương pháp.

Câu trả lời:


193

Sử dụng ByteArrayOutputStreammột vùng đệm:

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final String utf8 = StandardCharsets.UTF_8.name();
    try (PrintStream ps = new PrintStream(baos, true, utf8)) {
        yourFunction(object, ps);
    }
    String data = baos.toString(utf8);

10
Đừng quên đóng PrintStream để giải phóng tất cả tài nguyên.
tobr

9
Tôi đề nghị sử dụng PrintStream ps = new PrintStream(baos,true,"utf-8");để tránh hỗn loạn bảng mã
Tiến sĩ Max Völkel,

5
Sử dụng new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);có sẵn từ 1,7 , nó không ném
earcam

2
@tobr chắc chắn là một nguyên tắc chung, nhưng ByteArrayOutputStream.close()" không có tác dụng ", vì không có tài nguyên nào để giải phóng ngoài mảng hỗ trợ sẽ được xử lý bởi bộ thu gom rác.
dimo414

ByteArrayOutputStreamtoString(String charsetName), nhưng chỉ chấp nhận đối số Chuỗi. Cũng xin lưu ý rằng ByteArrayOutputStream được đồng bộ hóa , điều này có thể không mong muốn
đừng hoảng sợ

31

Bạn có thể tạo một PrintStream với ByteArrayOutputStream được truyền vào hàm khởi tạo mà sau này bạn có thể sử dụng để lấy văn bản được ghi vào PrintStream.

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");

5

Một sự thống nhất của các câu trả lời trước, câu trả lời này hoạt động với Java 1.7 trở về sau. Ngoài ra, tôi đã thêm mã để đóng Luồng.

final Charset charset = StandardCharsets.UTF_8;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true, charset.name());
yourFunction(object, ps);
String content = new String(baos.toByteArray(), charset);
ps.close();
baos.close();


-3

Xác định và khởi tạo biến Máy quét có tên inSS tạo luồng chuỗi đầu vào bằng cách sử dụng biến chuỗi myStrLine.

Trả lời: Máy quét inSS = Máy quét mới (myStrLine);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.