Como clonar um inputstream em java em tempo mínimo
Alguém pode me dizer como clonar um fluxo de entrada, tendo o menor tempo de criação possível? Eu preciso clonar um fluxo de entrada várias vezes para vários métodos para processar o IS. Eu tentei três maneiras e as coisas não funcionam por um motivo ou outro.
Método # 1: Graças à comunidade stackoverflow, achei o seguinte link útil e incluí o trecho de código no meu programa.
No entanto, usar esse código pode levar até um minuto (para um arquivo de 10 MB) para criar os fluxos de entrada clonados e meu programa precisa ser o mais rápido possível.
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);
Método # 2: Eu também tentei usar o BufferedInputStream para clonar o IS. Isso foi rápido (tempo de criação mais lento == 1ms. Mais rápido == 0ms). No entanto, depois que eu enviei is1 para ser processado, o processamento de métodos is2 e is3 lançaram um erro dizendo que não havia nada para processar, quase como todas as 3 variáveis abaixo referenciadas a mesma IS.
is = getFileFromBucket(path,filename);
...
...
InputStream is1 = new BufferedInputStream(is);
InputStream is2 = new BufferedInputStream(is);
InputStream is3 = new BufferedInputStream(is);
Método # 3: Eu acho que o compilador está mentindo para mim. Eu verifiquei markSupported () para is1 para os dois exemplos acima. Ele retornou verdadeiro, então eu pensei que poderia correr
is1.mark()
is1.reset()
ou apenas
is1.reset();
antes de passar o IS para os meus respectivos métodos. Nos dois exemplos acima, recebo um erro dizendo que é uma marca inválida.
Estou sem ideias agora, obrigado antecipadamente por qualquer ajuda que você possa me dar.
P.S. Dos comentários que recebi das pessoas, preciso esclarecer algumas coisas sobre a minha situação: 1) Este programa está sendo executado em uma VM 2) O fluxo de entrada está sendo passado para mim de outro método. Eu não estou lendo de um arquivo local 3) O tamanho do fluxo de entrada não é conhecido