# InputStream kopieren?



## Romsl (13. Januar 2006)

Hallo,

Ist es möglich einen InputStream zu kopieren? Der Grund ist, dass ein File validiert werden muss (extern) und dann die Daten erst gelesen.

Danke


----------



## deepthroat (13. Januar 2006)

Hi.

Du könntest entweder die Datei nochmal neu öffnen oder du benutzt die mark() reset() Methoden des InputStream's:

```
if (inStr.markSupported()) {
  inStr.mark();
  /* Datei validieren... */
  inStr.reset();
  /* Datei nochmal lesen. */
}
```
Das setzt natürlich voraus das die Validierungs-Methode die mark() Methode des Streams nicht aufruft und somit verändert.

Dann könntest du die Datei auch komplett in den Speicher lesen und einen StringBufferInputStream verwenden.

Gruß


----------



## Romsl (13. Januar 2006)

Das erste hatte ich auch in Erwägung gezogen. Nur was mache ich wenn ein mark eben nicht unterstützt wird?


----------



## Thomas Darimont (13. Januar 2006)

Hallo!



> Dann könntest du die Datei auch komplett in den Speicher lesen und einen StringBufferInputStream verwenden.


 Ich würde eher einen ByteArrayOutputStream verwenden... StringBufferInputStream ist deprecated

 Weshalb wird die Datei nicht einmal eingelesen, dann validiert und wenn noetig weggeworfen? Zweimal die selben Daten lesen ... muss doch nicht sein ;-).

  Gruss Tom


----------



## Romsl (15. Januar 2006)

Hi Tom,

ich habe einen XML Mechanismus geschrieben, der mir den Inhalt eines XML Files in einzelne Fragmente unterteilt und diese dann an den DOM4J übergibt. Somit habe ich die Möglichkeit DOM zu verwenden (muss nichts einfügen) und trotzdem große Dateien einzulesen. Handelt sich um einen Import.
Jetzt muss ich die XML Datei aber validieren und dies kann ich nur mit dem kompletten File. Ich hätte jetzt die Validierung SAX übernehmen lassen und wäre danach dann mit meinem Mechanismus eingestiegen. (Habe keine Ahnung wie man einen Validator - DTD und XMLSchema - implementiert). Als Eingabe erhalte ich eben einen InputStream.

Gibt es hierfür eine bessere Lösung?

Gruß

Romsl


----------



## Thomas Darimont (15. Januar 2006)

Hallo!



> ich habe einen XML Mechanismus geschrieben, der mir den Inhalt eines XML Files in einzelne Fragmente unterteilt und diese dann an den DOM4J übergibt. Somit habe ich die Möglichkeit DOM zu verwenden (muss nichts einfügen) und trotzdem große Dateien einzulesen. Handelt sich um einen Import.
> Jetzt muss ich die XML Datei aber validieren und dies kann ich nur mit dem kompletten File. Ich hätte jetzt die Validierung SAX übernehmen lassen und wäre danach dann mit meinem Mechanismus eingestiegen. (Habe keine Ahnung wie man einen Validator - DTD und XMLSchema - implementiert). Als Eingabe erhalte ich eben einen InputStream.


 
 Weshalb verwendest du überhaupt DOM, wenn du doch nichts im Dokument manipulierst? Ich würde die "große" Datei mit einem SAX oder XML Pull Parser mit aktivierter Validierung vearbeiten, dann die Elemente identifizieren die herausgezogen werden sollen und diese dann an DOM4J übergeben.

  Gruß Tom


----------



## Romsl (18. Januar 2006)

Ich erspar mir doch so die Handler, oder nicht Da es sich um viele geschachtelte Elemente handelt, dachte ich es wäre so einfacher.


----------



## Thomas Darimont (18. Januar 2006)

Hallo!



> Ich erspar mir doch so die Handler, oder nicht Da es sich um viele geschachtelte Elemente handelt, dachte ich es wäre so einfacher.


 Schon, aber du wolltest doch das Dokument nur einmal einlesen... weiterhin kenne ich den Aufbau und die Dimensionen deines XML Dokumentes nicht.

 Wie gesagt, ueber einen SAXParser koenntest du die Validierung aktivieren und die entsprechenden XML Fragemente relativ einfach aus dem grossen XML Dokument herausloesen und auf entsprechende Objekte mappen.


 Gruss Tom


----------



## Romsl (18. Januar 2006)

Ok, jetzt versteh ich was du meinst. Hört sich gut an. Muss dann wohl den kompletten Mechanismus umbauen   . Aber das geht dann schon klar.

Danke

Romsl


----------

