Für mich bestand die einfachste Lösung darin, das Objekt zu übergeben, von dem der InputStream erhalten werden konnte, und es einfach erneut zu erhalten. In meinem Fall war es von %code% .
Ich habe es mit einem Java-Code zu tun, in dem es einen InputStream gibt, den ich einmal gelesen habe, und dann muss ich ihn noch einmal in derselben Methode lesen.
Das Problem ist, dass ich seine Position zum Anfang zurücksetzen muss, um es zweimal zu lesen.
Ich habe eine hack-ish Lösung für das Problem gefunden:
%Vor%Führt diese Lösung zu unerwarteten Verhaltensweisen? Oder wird es in seiner Dummheit funktionieren?
Wie Sie geschrieben haben, haben Sie keine Garantien, da mark()
nicht melden muss, ob es erfolgreich war. Um eine Garantie zu erhalten, müssen Sie zuerst markSupported () aufrufen. , und es muss true
zurückgeben.
Ebenso wie geschrieben, ist die angegebene Lesegrenze sehr gefährlich. Wenn Sie einen Stream verwenden, der den Arbeitsspeicher puffert, wird möglicherweise ein Puffer von 2 GB zugewiesen. Auf der anderen Seite, wenn Sie ein FileInputStream
verwenden, geht es Ihnen gut.
Ein besserer Ansatz ist die Verwendung von BufferedInputStream
mit einem expliziten Puffer.
Sie können das nicht zuverlässig tun; Einige InputStream
s (z. B. solche, die an Terminals oder Sockets angeschlossen sind) unterstützen mark
und reset
nicht (siehe %Co_de% ). Wenn Sie die Daten wirklich zweimal durchlaufen müssen, müssen Sie sie in Ihren eigenen Puffer lesen.
Es hängt von der InputStream-Implementierung ab. Sie können auch überlegen, ob es besser ist, wenn Sie byte [] verwenden. Der einfachste Weg ist die Verwendung von Apache commons-io :
%Vor% Anstatt zu versuchen, das InputStream
zurückzusetzen, lade es in einen Puffer wie ein StringBuilder
oder, wenn es ein binärer Datenstrom ist, ein ByteArrayOutputStream
. Sie können den Puffer innerhalb der Methode so oft wie gewünscht verarbeiten.
Ich habe es mit einem Java-Code zu tun, in dem es einen InputStream gibt, den ich einmal gelesen habe, und dann muss ich ihn noch einmal in derselben Methode lesen.
Das Problem ist, dass ich seine Position zum Anfang zurücksetzen muss, um es zweimal zu lesen.
Ich habe eine hack-ish Lösung für das Problem gefunden:
%Vor%Führt diese Lösung zu unerwarteten Verhaltensweisen? Oder wird es in seiner Dummheit funktionieren?
Es hängt von der InputStream-Implementierung ab. Sie können auch überlegen, ob es besser ist, wenn Sie byte [] verwenden. Der einfachste Weg ist die Verwendung von Apache commons-io :
%Vor% Wie Sie geschrieben haben, haben Sie keine Garantien, da ContentResolver
nicht melden muss, ob es erfolgreich war. Um eine Garantie zu erhalten, müssen Sie zuerst markSupported () aufrufen. , und es muss %code% zurückgeben.
Ebenso wie geschrieben, ist die angegebene Lesegrenze sehr gefährlich. Wenn Sie einen Stream verwenden, der den Arbeitsspeicher puffert, wird möglicherweise ein Puffer von 2 GB zugewiesen. Auf der anderen Seite, wenn Sie ein %code% verwenden, geht es Ihnen gut.
Ein besserer Ansatz ist die Verwendung von %code% mit einem expliziten Puffer.
Anstatt zu versuchen, das %code% zurückzusetzen, lade es in einen Puffer wie ein %code% oder, wenn es ein binärer Datenstrom ist, ein %code% . Sie können den Puffer innerhalb der Methode so oft wie gewünscht verarbeiten.
%Vor%Sie können das nicht zuverlässig tun; Einige %code% s (z. B. solche, die an Terminals oder Sockets angeschlossen sind) unterstützen %code% und %code% nicht (siehe %Co_de% ). Wenn Sie die Daten wirklich zweimal durchlaufen müssen, müssen Sie sie in Ihren eigenen Puffer lesen.
Für mich bestand die einfachste Lösung darin, das Objekt zu übergeben, von dem der InputStream erhalten werden konnte, und es einfach erneut zu erhalten. In meinem Fall war es von %code% .