Jak sklonować strumień wejściowy w Javie w minimalnym czasie

Czy ktoś może mi powiedzieć, jak sklonować strumień wejściowy, biorąc jak najmniej czasu tworzenia? Muszę wielokrotnie klonować strumień wejściowy dla wielu metod przetwarzania IS. Próbowałem trzech sposobów, a rzeczy nie działają z tego lub innego powodu.

Metoda 1: Dzięki społeczności stackoverflow, poniższy link okazał się pomocny i umieściłem fragment kodu w moim programie.

Jak sklonować InputStream?

Jednak użycie tego kodu może zająć nawet minutę (w przypadku pliku 10 MB) do utworzenia sklonowanych strumieni wejściowych, a mój program musi być tak szybki, jak to możliwe.

    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);

Metoda 2: Próbowałem również użyć BufferedInputStream do sklonowania IS. Było to szybkie (najwolniejszy czas tworzenia = 1ms. Najszybszy == 0ms). Jednak po wysłaniu jest 1 do przetworzenia, metody przetwarzania is2 i is3 rzuciły błąd mówiący, że nie ma nic do przetworzenia, prawie jak wszystkie 3 zmienne poniżej, które odnoszą się do tego samego IS.

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

Metoda 3: Myślę, że kompilator mnie okłamuje. Sprawdziłem markSupported () dla is1 dla dwóch powyższych przykładów. Wróciło prawdziwe, więc pomyślałem, że mogę uciec

    is1.mark() 
    is1.reset()

Lub tylko

    is1.reset();

przed przekazaniem IS do moich odpowiednich metod. W obu powyższych przykładach pojawia się błąd mówiący, że jest to nieprawidłowy znak.

Nie mam już pomysłów, więc z góry dziękuję za wszelką pomoc, jaką możesz mi dać.

P.S. Z komentarzy, które otrzymałem od ludzi, muszę wyjaśnić kilka rzeczy dotyczących mojej sytuacji: 1) Ten program działa na maszynie wirtualnej 2) Strumień wejściowy jest przekazywany do mnie z innej metody. Nie czytam z lokalnego pliku 3) Rozmiar strumienia wejściowego nie jest znany

questionAnswers(4)

yourAnswerToTheQuestion