Czy ktoś może mi powiedzieć, jak sklonować wejście, biorąc jak najmniej czasu na tworzenie? Muszę wielokrotnie klonować inputstream dla wielu metod przetwarzania IS. Próbowałem na trzy sposoby i rzeczy nie działają z tego czy innego powodu.Jak sklonować strumień wejściowy w języku Java w minimalnym czasie?
Metoda nr 1: Dzięki społeczności stackoverflow znalazłem następujący link, który był pomocny i włączyłem fragment kodu do mojego programu.
Jednak użycie tego kodu może trwać do jednej minuty (dla pliku 10 MB), aby utworzyć sklonowane inputstreams i mój program musi być tak szybko, 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);
Sposób nr 2: Próbowałem też za pomocą BufferedInputStream sklonować IS. To był szybki (najwolniejszy czas tworzenia == 1 ms. Najszybszy == 0ms). Jednak po tym, jak wysłałem is1 do przetworzenia, przetwarzanie metod is2 i is3 spowodowało błąd mówiąc, że nie było nic do przetworzenia, prawie tak jak wszystkie 3 zmienne poniżej odnoszące się do tego samego IS.
is = getFileFromBucket(path,filename);
...
...
InputStream is1 = new BufferedInputStream(is);
InputStream is2 = new BufferedInputStream(is);
InputStream is3 = new BufferedInputStream(is);
Sposób nr 3: myślę kompilator mnie okłamuje. Sprawdziłem markSupported() dla is1 dla dwóch powyższych przykładów. To prawda wrócił więc pomyślałem mogłem uruchomić
is1.mark()
is1.reset()
lub po prostu
is1.reset();
przed przekazaniem IS do moich odpowiednich metod. W obu powyższych przykładach pojawia się komunikat o nieprawidłowym oznaczeniu.
Brakuje mi pomysłów, więc z góry dzięki za 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 VM 2) Wejście jest przekazywane do mnie z innej metody. Nie jestem czytania z lokalnego pliku 3) Wielkość InputStream nie jest znany
Uruchomienie kodu dla metody nr 1 zajmuje 18 ms (w przypadku pliku 10 MB) na moim komputerze. Czy coś jest nie tak z twoim sprzętem? –
Dzięki za odpowiedź. Nie sądzę, żeby coś było nie tak z moim sprzętem. Po prostu uderzyło mnie to, że zapomniałem wspomnieć o 2 rzeczach: a) to jest na maszynie wirtualnej i b) wejście to plik jpg. Najszybszy jest czas 11 sekund, ale moje testy sprawdzają się, uśrednianie trwa około 30 sekund, najwolniej trwało około 1 minuty (dokładnie 53 sekundy). – Classified
Możesz uzyskać nieznaczne zwiększenie, jeśli to zrobisz: bajt [] ba = new byte [is.available()]; // Działa, jeśli jest to FileInputStream new DataInputStream (is) .readFully (ba); –