Tôi có phương thức chấp nhận InputStream
(dữ liệu nhị phân) và tuần tự hóa nó thành XML. Để làm như vậy, nó kết thúc tốt đẹp luồng bằng bộ mã hóa base64 và Reader
để chuyển đổi nó thành dữ liệu ký tự. Tuy nhiên, kể từ khi InputStream
được chuyển thành tham số, tôi sẽ coi đó là một tác dụng phụ có hại để đóng luồng và hợp đồng cho Reader.close()
cho biết sẽ thực hiện điều đó. Nếu tôi không đóng reader, trình biên dịch cảnh báo với tôi rằng tôi có một sự rò rỉCó thể đóng Trình đọc mà không đóng luồng không?
Resource: đọc không bao giờ đóng
Vì vậy, tôi có thể thêm một @SuppressWarnings("resource")
để tuyên bố độc giả, nhưng là điều đúng đắn phải làm là gì? Tui bỏ lỡ điều gì vậy?
Đây là mã thực tế:
/**
* Writes base64 encoded text read from the binary stream.
*
* @param binaryStream
* The binary stream to write from
* @return <code>this</code> XmlWriter (for chaining)
* @throws IOException
*/
public XmlWriter binary(InputStream binaryStream) throws IOException {
Reader reader = new InputStreamReader(
new Base64InputStream(binaryStream, true, base64LineLength, base64LineSeparator.getBytes(charset)));
int bufferSize = 2048;
int charsRead;
char[] buffer = new char[bufferSize];
while ((charsRead = reader.read(buffer, 0, bufferSize)) >= 0) {
writer.write(buffer, 0, charsRead);
}
return this;
}
mục đích của bạn vì muốn giữ Stream mở là gì? Bạn chỉ có thể mở lại bất kỳ lúc nào. – mabako
Ngoài ra, có cách nào để bạn có thể thay đổi mã của mình để tạo một Reader cho InputStream và chuyển nó tới các phương thức cần Reader không? Bằng cách này hay cách khác, Reader và luồng đầu vào phải được đóng lại với nhau. –
@mabako, nó không thực sự là một mong muốn để giữ cho dòng mở, nhiều hơn của một trách nhiệm điều. Tôi cố gắng đóng mọi thứ nơi nó được mở ra. Nếu phương thức nhị phân đóng luồng và một cái gì đó bên ngoài cuộc gọi này cố gắng làm điều gì đó với nó, nó có thể thông qua một ngoại lệ mà người dùng không mong đợi. – Lucas