As modificações dependem de como essa rotina está feita. O que precisa é modifica-la para receber uma entrada de dados independente, ao invés de objeto File que só permite utilizá-la com dados gravados em arquivos físicos.
Vou dar um exemplo:
Suponha que a rotina seja algo assim:
void fazAlgumaCoisa(File f) {
// ... faz alguma coisa ...
// Instancia um stream para leitura do arquivo
InputStream input = new FileInputStream(f);
// ...
while (/*..alguma condiçao...*/) {
// Le o arquivo atraves do input stream
variavel = input.read();
// ..... Faz alguma coisa com os bytes lidos .....
}
// Fecha o arquivo
input.close();
}
O que se quer é que essa rotina não dependa de arquivo físico. Como fazer isso? Passando uma fonte de dados independente, que pode vir de qualquer lugar, de um arquivo, de um socket na rede, ou de um array de bytes que já tenho carregado.
Então nada melhor que passar o próprio InputStream, pois é uma interface que pode ser conectada a qualquer tipo de origem de dados.
void fazAlgumaCoisa(InputStream input) {
// ... faz alguma coisa ...
// O Stream já foi passado pronto, então é só ler!
while (/*..alguma condiçao...*/) {
// Le o arquivo atraves do input stream
variavel = input.read();
// ..... Faz alguma coisa com os bytes lidos .....
}
// Fecha o arquivo
input.close();
}
Então você chama a função assim:
byte[] meuArray = ...// Obtenho o array da forma que está funcionando hoje.
InputStream input = new ByteArrayInputStream(meuArray); // Esse é um inputStream que está conectado ao array de bytes, ou seja, serve para ler seu conteúdo
fazAlgumaCoisa(input); // Chamo a rotina anterior
Mas quando fiz isso começou a dar pau em um monte de lugares onde essa rotina era chamada antes, passando um File como parâmetro! :shock:
Essa parte é fácil de resolver, é só criar um outro método para atender a funcionalidade já existente, mas sem duplicar o código. Ele seria assim:
void fazAlgumaCoisa(File f) {
InputStream input = new FileInputStream(f); // Cria um inputStream a partir do arquivo
fazAlgumaCoisa(input); // Chama a função anterior, reaproveitando todo o código sem duplicá-lo.
}
Funcionalmente esse método é idêntico àquele primeiro, mas a diferença é que agora existe também a outra forma de chama-lo, que é mais genérica permitindo o uso de outras origens de dados.
-------------------------------------------
Concluindo:
Usei aqui um exemplo em que a refatoração a ser feita era razoavelmente óbvia, a alteração específica no seu caso depende do que a rotina faz, mas já serve para dar uma direção sobre como analisar o caso!