# InputStream öfters nutzen



## WeirdAl (15. Okt 2007)

Hallo,
ich muss im Rahmen eines Servlets den request.inputStream mehrfach auslesen. Muss ich mit mark() und reset() arbeiten oder kann ich einen InputStream erzeugen, der nach dem auslesen des Streams automatisch an den Anfang wieder zurück springt?


----------



## thE_29 (15. Okt 2007)

Guck dir mal die RandomAccessFile Klasse an!
Da kannst auch hin und herspringen!


----------



## Marco13 (15. Okt 2007)

Man könnte zwar einen InputStream implementieren, der das gewünschte Verhalten aufweist, aber letztendlich wäre das entweder schrecklich aufwändig, oder würde auch wieder auf mark&reset zurückgreifen. (D.h man könnte einen InputStream implementieren, der alle methoden an den darunterliegenden InputStream weiterreichst (d.h. an den, den du jetzt verwendest) und "selbstständig" das mark&reset ausführt, wenn er am Anfang bzw. Ende angekommen ist...


----------



## mikachu (16. Okt 2007)

oder lies den gesamten content des intputstreams in einen bytearray ein, und öffne dann auf diesen immer wieder einen neuen stream zum lesen


----------



## WeirdAl (16. Okt 2007)

Danke für die Tipps. Ich habe es mit dem letzten Tipp versucht, jedoch bekomme ich Probleme bei größeren Streams. Zur Zeit sieht der Code zum "umkopieren" folgendermaßen aus:


```
byte[] inByte = new byte[request.getContentLength()];
		InputStream sin = request.getInputStream();
		sin.read(inByte);
```

Bei kleinen XML Dateien (das sind die Streams) klappt dies sehr gut. Sobald es sich jedoch um eine große Datei handelt, steht ab einer bestimmten Position nur noch Müll im byte Array:


```
</material>
		<material number="000000000000015011">
			<ean11>000000000 <- ab hier nur noch ewig viele "Vierecke" ......
```

Habt Ihr eine Idee wo dran dies liegen könnte?

Edit: ich benutze den ServletInputStream als ByteArrayInputStream weiter. Könnte dies das Problem sein und wenn ja, wie kann ich dieses lösen?


```
InputStream in = new ByteArrayInputStream(inByte);
```


----------



## tuxedo (16. Okt 2007)

Du musst unter Umständen read() mehrfach ausführen. Schau doch mal mit sin.available() wieviele bytes gelesen werden können?!

- Alex


----------



## maki (16. Okt 2007)

> ch muss im Rahmen eines Servlets den request.inputStream mehrfach auslesen.


Darf man fragen, warum?


----------



## WeirdAl (16. Okt 2007)

Das mit dem available ist ne gute Idee, danke 

@Maki: Ich schick von einem Client A per HTTP Post einen XML Stream an das Servlet. Das Servlet liest den Inputstream aus und validiert diesen Stream mit einem Schema. Falls dies erfolgreich war, wird der InputStream an einen Server B weitergeleitet. Ich muss praktisch 1x den Stream zum validieren und 1x zum weiterleiten (umwandeln Input- in OutputStream) auslesen.


----------



## maki (16. Okt 2007)

Http Post?

Wird das XML als Datei oder als Content versendet?


----------



## WeirdAl (16. Okt 2007)

Das XML wird als Content versendet.


----------

