Mira, si necesitas leer y escribir lo puedes hacer utilizando la clase RandomAccessFile...
try {
// Creación del archivo de acceso aleatorio
java.io.RandomAccessFile archivo = new java.io.RandomAccessFile("c:\\prueba.txt","rw");
// Desplazamiento por el archivo:
archivo.seek(0);
// Escritura de datos:
archivo.writeBytes("Prueba de texto\n");
archivo.seek(0);
// Lectura de datos:
System.out.println(archivo.readLine());
// Sobreescritura de datos:
archivo.seek(10);
archivo.writeBytes("datos\n");
// Lectura de datos:
archivo.seek(0);
System.out.println(archivo.readLine());
archivo.close();
} catch(java.io.IOException e) {};
Ahora, puedes leer y escribir tipos basicos en forma binaria con las funciones read y write.
Aquí esta la salida del ejemplo anterior:
Prueba de texto
Prueba de datos
Si como dices solo estas haciendo un registro, también podes utilizar el FileWriter en modo append, solo que abrilo de esta manera:
FileWriter bitacora = new FileWriter("c:\\bitacora.txt",true);
Así todos los datos nuevos solo serian agregados al final del archivo. Para un registro esta es la manera mas adecuada de hacerlo.
Te quedaría así:
FileWriter bitacora = new FileWriter("c:\\bitacora.txt",true);
BufferedWriter bw = new BufferedWriter(bitacora);
PrintWriter salida = new PrintWriter(bw);
salida.println(formato.format(fecha) + " No se pudo enviar archivo al controlador " + ioe.getMessage());
salida.close();