Ich habe eine Methode, die eine InputStream
(von Binärdaten) akzeptiert und es in XML serialisiert. Um dies zu tun, wird der Stream mit einem Base64-Encoder und einem Reader
umwandelt, um es in Zeichendaten umzuwandeln. Da jedoch die InputStream
als ein Parameter übergeben wird, würde ich es als einen schädlichen Nebeneffekt betrachten, den Stream zu schließen, und der Vertrag für Reader.close()
sagt, dass es genau das tun würde. Wenn ich den Leser nicht schließen, warnt der Compiler mir, dass ich einIst es möglich, einen Reader zu schließen, ohne den Stream zu schließen?
Ressourcenleck: Leser nie
So geschlossen sind, habe ich ein @SuppressWarnings("resource")
den Leser Erklärung hinzufügen kann, ist aber das Richtige zu tun? Fehle ich etwas? Hier
ist der eigentliche Code:
/**
* 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;
}
Was ist Ihr Ziel, die Strom offen halten zu wollen? Sie können es jederzeit wieder öffnen. – mabako
Gibt es eine Möglichkeit, Ihren Code zu ändern, um einen Reader für den InputStream zu erstellen, und ihn an Methoden zu übergeben, die einen Reader benötigen? Auf die eine oder andere Art sollten der Reader und der Eingabestrom zusammen geschlossen werden. –
@ mabako, es ist nicht wirklich ein Wunsch, den Stream offen zu halten, ist es eher eine Verantwortung Sache. Ich versuche alles zu schließen, wo es geöffnet ist. Wenn die Binärmethode den Stream schließt und etwas außerhalb dieses Aufrufs versucht, etwas damit zu tun, könnte dies durch eine Ausnahme geschehen, die der Benutzer nicht erwartet hat. – Lucas