So klonen Sie einen Eingabestream in Java in kürzester Zeit

Kann mir jemand sagen, wie man einen Inputstream klont und dabei so wenig Erstellungszeit wie möglich benötigt? Ich muss einen Inputstream mehrmals klonen, damit mehrere Methoden den IS verarbeiten können. Ich habe drei Möglichkeiten ausprobiert und Dinge funktionieren aus dem einen oder anderen Grund nicht.

Methode 1: Dank der Stackoverflow-Community fand ich den folgenden Link hilfreich und habe das Code-Snippet in mein Programm aufgenommen.

Wie klone ich einen InputStream?

Die Verwendung dieses Codes kann jedoch bis zu einer Minute dauern (für eine 10-MB-Datei), um die geklonten Eingabestreams zu erstellen, und mein Programm muss so schnell wie möglich sein.

    int read = 0;
    byte[] bytes = new byte[1024*1024*2];

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    while ((read = is.read(bytes)) != -1)
        bos.write(bytes,0,read);
    byte[] ba = bos.toByteArray();

    InputStream is1 = new ByteArrayInputStream(ba);
    InputStream is2 = new ByteArrayInputStream(ba);
    InputStream is3 = new ByteArrayInputStream(ba);

Methode 2: Ich habe auch versucht, mit BufferedInputStream den IS zu klonen. Dies war schnell (langsamste Erstellungszeit == 1 ms. Schnellste == 0 ms). Nachdem ich jedoch "is1" zur Verarbeitung gesendet habe, haben die Methoden "is2" und "is3" einen Fehler ausgegeben, der besagt, dass nichts zu verarbeiten war, fast so, als ob alle drei unten aufgeführten Variablen auf denselben IS verwiesen hätten.

    is = getFileFromBucket(path,filename);
    ...
    ...
    InputStream is1 = new BufferedInputStream(is);
    InputStream is2 = new BufferedInputStream(is);
    InputStream is3 = new BufferedInputStream(is);

Methode 3: Ich glaube, der Compiler lügt mich an. In den beiden obigen Beispielen habe ich markSupported () auf is1 überprüft. Es hat sich bewahrheitet, also dachte ich, ich könnte rennen

    is1.mark() 
    is1.reset()

oder nur

    is1.reset();

bevor ich den IS an meine jeweiligen Methoden weitergebe. In beiden obigen Beispielen erhalte ich die Fehlermeldung, dass es sich um eine ungültige Marke handelt.

Ich habe jetzt keine Ideen mehr, also danke im Voraus für jede Hilfe, die du mir geben kannst.

P.S. Aus den Kommentaren, die ich von Leuten erhalten habe, muss ich einige Dinge in Bezug auf meine Situation klarstellen: 1) Dieses Programm läuft auf einer VM 2) Der Inputstream wird von einer anderen Methode an mich weitergeleitet. Ich lese nicht aus einer lokalen Datei. 3) Die Größe des Inputstreams ist nicht bekannt

Antworten auf die Frage(4)

Ihre Antwort auf die Frage