¿Cómo podemos escribir una matriz de bytes en un archivo (y la lectura de ese archivo) en Java?
Sí, todos sabemos que ya hay un montón de preguntas como esa, pero tienen muy complicado y subjetivo debido al hecho de que hay muchas maneras de lograr esta tarea.
Así que vamos a reducir el alcance de la pregunta:
Dominio:
- Android / Java
Lo que queremos:
- Rápido (como es posible)
- Libre de bugs (en una rígida forma meticulosa)
Lo que no estamos haciendo:
- Las bibliotecas de terceros
- Las bibliotecas que requieren Android API más tarde de las 23 (Malvavisco)
(Por lo tanto, que las normas de Apache Commons, Google Guayaba, Java.nio, y nos deja con buen ol' Java.io)
Lo que necesitamos:
- Matriz de bytes es siempre exactamente el mismo (contenido y tamaño) después de pasar a través de la escritura, luego del proceso de lectura
- Escribir método sólo requiere dos argumentos: el Archivo, y byte[] datos
- Método Read devuelve un byte[] y sólo se requiere de un argumento: Archivo archivo
En mi caso particular, estos métodos son privados (no de una biblioteca) y NO se hace responsable de los siguientes, (pero si usted desea crear una solución universal que se aplica a un público más amplio, ir a por ello):
- Hilo de seguridad (archivo no pueda ser accedida por más de un proceso a la vez)
- Archivo null
- Archivo que apunta a inexistente ubicación
- La falta de permisos en la ubicación del archivo
- Matriz de bytes a ser demasiado grande
- Matriz de bytes null
- Tratar con cualquier "índice", "longitud" o "anexar" argumentos/capacidades
Así que... estamos en la búsqueda de la definitiva prueba de balas código que la gente en el futuro puede suponer que es seguro de usar, ya que su respuesta tiene la gran cantidad de votos y no hay comentarios que dicen, "Que puede fallar si..."
Esto es lo que tengo hasta ahora:
Escribir Bytes En El Archivo:
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);
}
}
Leer Bytes Desde El Archivo:
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;
}
Por lo que he leído, las posibles Excepciones son:
FileNotFoundException : ¿Estoy en lo cierto que esto no debería ocurrir mientras la ruta de acceso del archivo que está siendo suministrada se derivan de la utilización de Android propias herramientas internas y/o si la aplicación ha sido probado adecuadamente?
IOException : realmente no se sabe lo que puede causar esta... pero estoy asumiendo que no hay ninguna manera alrededor de ella si lo hace.
Así que con eso en mente... estos métodos pueden ser mejorados o reemplazados, y si es así, ¿con qué?