Mam metodę, która akceptuje InputStream
(danych binarnych) i serializuje go do XML. Aby to zrobić, zawija strumień za pomocą kodera base64 i Reader
, aby przekształcić go w dane postaci. Ponieważ jednak parametr InputStream
jest przekazywany jako parametr, uznam za szkodliwy efekt uboczny zamknięcie strumienia, a umowa o Reader.close()
mówi, że tak właśnie by się stało. Jeśli nie zamknąć czytnik, kompilator ostrzega mnie, że mam wyciekCzy można zamknąć czytnik bez zamykania strumienia?
zasobów: czytelnik nigdy nie jest zamknięta
Więc mogę dodać @SuppressWarnings("resource")
do deklaracji czytelnika, ale jest co należy zrobić? Czy czegoś brakuje?
Oto rzeczywisty kod:
/**
* 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;
}
Jaki jest Twój cel chcąc utrzymać Stream otwarte? Możesz go ponownie otworzyć w dowolnym momencie. – mabako
Czy istnieje sposób na zmianę kodu w celu utworzenia jednego Czytnika dla InputStream i przekazanie go metodom wymagającym czytnika Reader? Tak czy inaczej, czytnik i strumień wejściowy powinny być zamknięte razem. –
@mabako, to nie jest tak naprawdę pragnienie, aby utrzymać otwarty strumień, a tym bardziej odpowiedzialność. Próbuję zamknąć wszystko, gdzie jest otwarte. Jeśli metoda binarna zamknie strumień, a coś poza tym połączeniem spróbuje coś z nim zrobić, może to być spowodowane przez wyjątek, którego użytkownik się nie spodziewał. – Lucas