Java - Zurücksetzen von InputStream

9

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?

    
iMineLink 13.09.2013, 19:29
quelle

5 Antworten

5

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.

    
kdgregory 13.09.2013, 19:39
quelle
2

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.

    
chrylis 13.09.2013 19:37
quelle
1

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%     
stan 13.09.2013 19:38
quelle
1

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.

%Vor%     
Ravi Thapliyal 13.09.2013 19:39
quelle
0
___ qstnhdr ___ Java - Zurücksetzen von InputStream ___ qstntxt ___

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?

    
___ answer18793977 ___

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%     
___ answer18793987 ___

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.

    
___ tag123input ___ Die Eingabe bezieht sich normalerweise auf die Benutzereingabe, d. h. auf die Daten, die der Benutzer an eine laufende Anwendung liefert. In vielen Systemen wird diese Eingabe als potenziell gefährlich angesehen und muss bereinigt werden, um sicherzustellen, dass der Benutzer keinen ausführbaren Code in die Anwendung injiziert hat. ___ tag123stream ___ Ein Stream ist eine Reihe von Datenelementen, auf die seriell zugegriffen werden kann. Verwenden Sie für die neue Stream-API von Java 8 stattdessen das Java-Stream-Tag. ___ answer18793984 ___

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%     
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ answer18793955 ___

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.

    
___ antwort43961755 ___

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% .

    
___
user3175580 14.05.2017 08:10
quelle

Tags und Links