Como podemos escrever uma matriz de bytes para um arquivo (e lê-lo novamente a partir do arquivo) em Java?
Sim, todos nós sabemos que já existem muitas perguntas como essa, mas eles ficam muito confuso e subjetiva, devido ao fato de que há muitas maneiras de realizar essa tarefa.
Então, vamos reduzir o escopo da pergunta:
Domínio:
- Android / Java
O que queremos:
- Rápido (tanto quanto possível)
- Bug-free (em um rigidamente meticuloso forma)
O que não estamos fazendo:
- Bibliotecas de terceiros
- Todas as bibliotecas que exigem Android API mais tarde do que 23 (Marshmallow)
(Então, que as regras do Apache Commons, o Google Guava, Java.nio, e deixa-nos com o bom e velho' de Java.io)
O que precisamos:
- Matriz de bytes é sempre exatamente o mesmo (conteúdo e tamanho) depois de passar a escrever-então-processo de leitura
- Método de gravação apenas necessita de dois argumentos: o Ficheiro de arquivo e byte[] dados
- Leia método retorna um byte[] e exige apenas um argumento: Arquivo do arquivo
No meu caso em particular, estes métodos são privados (não uma biblioteca) e NÃO se responsabiliza pelo seguinte, (mas se você quiser criar uma solução universal que se aplica a um público mais amplo, vá para ele):
- Thread-safety (ficheiro não será acessado por mais do que um processo de uma só vez)
- Arquivo que está sendo nulo
- Arquivo apontando para o local inexistente
- A falta de permissões no arquivo de localização
- Matriz de bytes a ser muito grande
- Matriz de bytes a ser nulo
- Lidar com qualquer "index", "comprimento", ou "acrescentar" argumentos/capacidades
Então... estamos em busca do definitivo à prova de bala código que as pessoas no futuro pode assumir é seguro de usar porque a sua resposta tem lotes de votos e não existem comentários que dizem, "Que pode falhar se o..."
Isso é o que eu tenho até agora:
Bytes De Gravação Para O Arquivo:
private void writeBytesToFile(final File file, final byte[] data) {
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
} catch (Exception e) {
Log.i("XXX", "BUG: " + e);
}
}
Os Bytes De Leitura De Arquivo:
private byte[] readBytesFromFile(final File file) {
RandomAccessFile raf;
byte[] bytesToReturn = new byte[(int) file.length()];
try {
raf = new RandomAccessFile(file, "r");
raf.readFully(bytesToReturn);
} catch (Exception e) {
Log.i("XXX", "BUG: " + e);
}
return bytesToReturn;
}
Pelo que tenho lido, as possíveis Exceções são:
FileNotFoundException : Estou certo de que isso não deve acontecer tão longo como o caminho do arquivo a ser fornecida foi obtido usando o Android ferramentas internas e/ou se o aplicativo foi testado corretamente?
IOException : eu realmente não sei o que poderia causar isso... mas eu estou supondo que não há nenhuma maneira em torno dela se faz.
Então, com isso em mente... estes métodos podem ser aprimorados ou substituídos, e, em caso afirmativo, com que?