Método mais rápido de trabalhar com bits de arquivos sem ser lendo byte por byte

Olá, acabei de fazer um programinha que faz esteganografia(esconder uma mensagem secreta em um arquivo de imagem).
Ele está funcionando perfeitamente para os principais formatos de imagem, usando imagens pequenas o programa faz o processo rapidamente, porém algumas imagens grandes demora um pouco pra gravar o arquivo modificado, chegando a passar de 30 segundos pra imagens com 3 MB.
O programa funciona basicamente assim:

FileInputStream input=new FileInpitStream(arquivoDeEntrada);//arquivo que será a imagem original
FileOutputStream output=new FileOutputStream(arquivoDeSaida);
int byteImg;//irei guardar os bytes da imagem nessa variavel cada vez que percorrer o laço
while((byteImg=input.read())!=-1){
   //aqui eu transformo o byteImg em uma String em formato binário(01010101)
   //e entra um algoritmo que troca alguns bits desse "byte" e joga esse "byte" modificado dentro do output.
}

Gostaria de saber se é possivel trabalhar com os bits de arquivos de forma rápida mesmo com imagens grandes.

[quote=mateusviccari]Olá, acabei de fazer um programinha que faz esteganografia(esconder uma mensagem secreta em um arquivo de imagem).
Ele está funcionando perfeitamente para os principais formatos de imagem, usando imagens pequenas o programa faz o processo rapidamente, porém algumas imagens grandes demora um pouco pra gravar o arquivo modificado, chegando a passar de 30 segundos pra imagens com 3 MB.
O programa funciona basicamente assim:

FileInputStream input=new FileInpitStream(arquivoDeEntrada);//arquivo que será a imagem original
FileOutputStream output=new FileOutputStream(arquivoDeSaida);
int byteImg;//irei guardar os bytes da imagem nessa variavel cada vez que percorrer o laço
while((byteImg=input.read())!=-1){
   //aqui eu transformo o byteImg em uma String em formato binário(01010101)
   //e entra um algoritmo que troca alguns bits desse "byte" e joga esse "byte" modificado dentro do output.
}

Gostaria de saber se é possivel trabalhar com os bits de arquivos de forma rápida mesmo com imagens grandes.[/quote]

vc está lendo 1 byte por vez ? aí demora mesmo

Tanto o InputStream quanto o OutputStream tem métodos que te permitem ler/escrever blocos de bytes com arrays de bytes; Daí basta escolher um tamanho de array que equilibre E/S com processamento.

Argh! Não faça isso.
Pra começar, converter para string em formato binário pode ser bom para você entender ou debugar seu programa, mas na prática é perda de tempo.

Em vez disso, você deve:

a) Trabalhar com blocos de bytes, lendo-os de uma vez (em vez de um byte de cada vez - argh ugh argh)
b) Usar operações que trabalham sobre bytes, como & , ^ ou |.

Por exemplo, digamos que eu quisesse setar o bit 7 (mais significativo) do byte 240 do array de bytes “by”.

Eu usaria:

by [240] |= (1 << 7);

Para resetar o bit 0 (menos significativo) do byte 224:

by [224] &= ~ (1 << 0);

Para inverter o bit 3 do byte 126:

by [126] ^= (1 << 3);

Vou dar um exemplo de um programa que seta o bit 6 de cada byte do arquivo original.
Obviamente se você tentar fazer isso com um jpeg, vai acabar corrompendo o cabeçalho (ou seja, o arquivo vai ficar ilegível) e você não vai ter uma verdadeira estenografia.

public void setarBit6 (InputStream is, OutputStream os) throws IOException {
    byte[] buffer = new byte[1024];
    int nBytesLidos;
    while ((nBytesLidos = is.read (buffer)) > 0) {
        for (int i = 0; i < nBytesLidos; ++i) {
            buffer [i] |= (1 << 6);
        }
        os.write (buffer, 0, nBytesLidos);
    }
}

Não se esqueça, obviamente, de fechar os arquivos depois de usar essa rotina (essa rotina não fecha os arquivos).