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.

Como clonar um InputStream?

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

questionAnswers(4)

yourAnswerToTheQuestion