Qualcuno può dirmi come clonare un inputstream, prendendo il minor tempo possibile per la creazione? Ho bisogno di clonare un inputstream più volte per più metodi per elaborare l'IS. Ho provato tre modi e le cose non funzionano per un motivo o per l'altro.Come clonare un inputstream in java in un tempo minimo
Metodo n. 1: Grazie alla community di stackoverflow, ho trovato utile il seguente link e ho incorporato lo snippet di codice nel mio programma.
Tuttavia, utilizzando questo codice può richiedere fino a un minuto (per un file di 10 MB) per creare le inputstreams clonati e il mio programma ha bisogno di essere il più veloce possibile.
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);
Metodo # 2: Ho anche provato ad utilizzare BufferedInputStream per clonare la IS. Questo è stato veloce (tempo di creazione più lento == 1 ms. Più veloce == 0 ms). Tuttavia, dopo che ho inviato is1 per essere elaborato, l'elaborazione dei metodi è2 e is3 ha generato un errore che diceva che non c'era nulla da elaborare, quasi come tutte le 3 variabili sotto indicate con lo stesso IS.
is = getFileFromBucket(path,filename);
...
...
InputStream is1 = new BufferedInputStream(is);
InputStream is2 = new BufferedInputStream(is);
InputStream is3 = new BufferedInputStream(is);
Metodo # 3: penso che il compilatore sta mentendo a me. Ho controllato markSupported() per is1 per i due esempi sopra. E 'tornato vero così ho pensato che avrei potuto correre
is1.mark()
is1.reset()
o semplicemente
is1.reset();
prima di passare la è di mio rispettivi metodi. In entrambi gli esempi precedenti, viene visualizzato un errore che indica che si tratta di un segno non valido.
Sono fuori di idee ora, quindi grazie in anticipo per qualsiasi aiuto tu possa darmi.
P.S. Dai commenti che ho ricevuto dalle persone, ho bisogno di chiarire un paio di cose riguardanti la mia situazione: 1) Questo programma è in esecuzione su una VM 2) L'inputstream viene passato in me da un altro metodo. Io non sto leggendo da un file locale 3) La dimensione del InputStream non è noto
L'esecuzione del codice per il metodo n. 1 richiede 18 ms (per un file da 10 MB) sul computer. C'è qualcosa che non va nel tuo hardware? –
Grazie per la risposta. Non penso che ci sia qualcosa di sbagliato nel mio hardware. Mi ha appena colpito che ho dimenticato di menzionare 2 cose: a) questo è su una VM eb) l'inputstream è di un file jpg. Il tempo più veloce è di 11 secondi, ma osservo i miei test, la media è di circa 30 secondi, il più lento è di circa 1 minuto (53 secondi per l'esattezza). – Classified
Se si esegue questa operazione, è possibile ottenere un incremento minore: byte [] ba = new byte [is.available()]; // Funziona se si tratta di un FileInputStream nuovo DataInputStream (is) .readFully (ba); –