Java - InputStream Zurücksetzen
Bin ich den Umgang mit einigen Java-code, in dem es einen InputStream, die lese ich einmal und dann muss ich Lesen das es mal wieder in der gleichen Methode.
Das problem ist, dass ich brauche, um es zurückzusetzen ist-position an den Anfang, Lesen Sie es zweimal.
Habe ich gefunden, der einen hack-ish Lösung für das problem:
is.mark(Integer.MAX_VALUE);
//Read the InputStream is fully
//{ ... }
try
{
is.reset();
}
catch (IOException e)
{
e.printStackTrace();
}
Führt diese Lösung dazu führen, dass einige unespected zu Verhalten? Oder es wird Arbeit in seiner Unbedarftheit?
- Könnte es scheitern in Situationen, die das Lesen von code wird
mark()
es auch. - Sie können in der Lage sein zu erweitern InputStream, überschreiben Sie die markieren-Methode so, dass Sie nur einmal aufgerufen werden, die in einer Instanz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie geschrieben, Sie haben keine Garantie, weil
mark()
ist nicht erforderlich, zu berichten, ob es erfolgreich war. Um eine Garantie, müssen Sie Sie zuerst in markSupported(), und es muss zurücktrue
.Auch, wie geschrieben, die angegebenen lese-Grenze ist sehr gefährlich. Wenn Sie zufällig über einen stream-Puffer im Speicher, wird es möglicherweise weisen einen 2GB Puffer. Auf der anderen Seite, wenn Sie geschehen, werden mit einem
FileInputStream
, bist du gut.Ein besserer Ansatz ist die Verwendung eines
BufferedInputStream
mit einer expliziten Puffer.Können Sie nicht zuverlässig; einige
InputStream
s (wie diejenigen, angeschlossen an den Klemmen oder Steckdosen) nicht unterstützenmark
undreset
(siehemarkSupported
). Wenn Sie wirklich zu Durchlaufen die Daten zweimal, müssen Sie Lesen Sie es in Ihrem eigenen Puffer.Kommt es auf den InputStream der Umsetzung. Sie können auch überlegen, ob es besser wird, wenn Sie mit byte[]. Der einfachste Weg ist die Verwendung von Apache commons-io:
Anstatt zu versuchen, zurücksetzen der
InputStream
laden Sie es in einen Puffer wie einStringBuilder
oder wenn es einen binären Datenstrom einenByteArrayOutputStream
. Man kann dann den Puffer innerhalb der Methode so viele Male, wie Sie möchten.Ist für mich die einfachste Lösung war, übergeben Sie das Objekt, von dem der InputStream erhalten werden konnte, und nur erhalten Sie es wieder. In meinem Fall war es von einem
ContentResolver
.