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