Hola.
Para no repetir la cabecera, tendrías que cambiar la estrategia.
Antes de escribir datos, comprobar si YA existe o NO existe el archivo .csv.
Si NO existe, porque es la primera vez que se ejecuta el programa, pues haces una primera escritura de solo los datos de la cabecera.
Si YA existe, debemos dar por hecho que ya contiene la cabecera, y solo escribirías los datos.
La comprobación la puedes hacer en ese mismo método, o en otro a parte.
Si lo haces por separado, puedes hacer ese método de tipo boolean, de manera que si el archivo YA existe, o no existe pero sea ha creado correctamente, retorne TRUE.
Si no consigue crearlo (por el motivo que sea), retornaría FALSE.
Así, en el método donde guardas los datos en csv, si este segundo método de comprobación no te da el "visto bueno" retornando TRUE, pues entonces no intentar guardar ningún dato, porque no te va a ser posible de todos modos.
Por ejemplo:
private static boolean checkFile(String filepath) {
File fichero = new File(filepath);
if (!fichero.exists()) //Si NO existe, lo creamos e iniciamos cabecera
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(fichero));
bw.write("#ID,Doctor,Especialidad");
bw.newLine();
bw.close();
return true; //La creación fue BIEN :)
} catch (IOException e) {
JOptionPane.showMessageDialog(null,"No se pudo crear: " + filepath);
return false; //La creación fue mal :(
}
else //Fichero YA existe
return true; //Como ya existe, NADA que hacer, damos el visto bueno ;)
}
public static void saveRecord(String id,String doctor,String especialidad, String filepath){
if (checkFile(filepath)) { //Solo si checkfile() retorna TRUE, intentaremos guardar datos
try{
FileWriter fw = new FileWriter(filepath, true);
BufferedWriter bw = new BufferedWriter(fw);
//No se necesita cabecera, ya la tiene el archivo existente
bw.write(id+","+doctor+","+especialidad);
bw.newLine();
bw.close();
JOptionPane.showMessageDialog(null,"Record Saved!");
}
catch(Exception E){
JOptionPane.showMessageDialog(null,"Record Not Saved!");
}
}
}