I have a file with employee records and I need to be able to modify them using RandomAccessFile. I've more or less succeeded, except that when the new record is shorter, I find myself adding spaces and when it's longer, I find myself as part of the next line.
I guess the solution goes through...
- grab the record and save the rest of the file from there forward in a temporary buffer
- delete both the desired record and everything that follows it
- write my log to end of file
- add what you have saved in the temporary buffer
The problem is that I have no idea how to do it.
My code here...
private static void actividad7(){
try {
String rutaCarpeta = ".\\carpetaEjercicio";
String nombreArchivo = "\\FichTextoActividad6b.txt";
File archivo = new File(rutaCarpeta + nombreArchivo);
String[] str = {"ID: 1, Apellido: FERNANDEZ, Departamento: 10 Salario:1050.45",
"ID: 2, Apellido: RAMOS Departamento: 20 Salario:1350.6",
"ID: 3, Apellido: GIL, Departamento: 10 Salario:1285.20",
"ID: 4, Apellido: LOPEZ, Departamento: 10 Salario:1530.17",
"ID: 5, Apellido: PONS, Departamento: 30 Salario:1427.65",
"ID: 6, Apellido: BARTUAL, Departamento: 30 Salario:1783.7",
"ID: 7, Apellido: HERNANDEZ, Departamento: 20 Salario:1130.55"};
int[] longitud = new int[str.length];
//El archivo es creado linea a linea con el texto contenido en "str" en una actividad anterior
if(!archivo.exists()){
System.out.println("No es encuentra el archivo. Ejecuta la actividad '6b'");
}else{
//guardo la longitud de cada una de las lineas
for(int i = 0; i< str.length; i++){
longitud[i] = str[i].length();
}
boolean encontrado = false;
System.out.println("Introduce la ID del empleado que deseas buscar");
Scanner sc = new Scanner (System.in);
String id = sc.nextLine();
//Aqui no voy a comprobar si es un numero, porque me da igual para esta actividad
System.out.println("Ahora introduce el nuevo salario");
String salario = sc.nextLine();
System.out.println("Ahora introduce el nuevo departamento");
String departamento = sc.nextLine();
//Esto es lo que me va a permitir encontrar el registro
String palabraClave = "ID: "+id;
String lineaNew = "asd";
String lineaOld = "asd"
int delStrSize = 0;
//Accedo al archivo en modo lectura para saber si existe el registro que se busca
RandomAccessFile raf = new RandomAccessFile(archivo, "r");
String linea = raf.readLine();
while(linea != null){
if(linea.contains(palabraClave)){
//Construyo el nuevo registro con el salario y el dept introducidos
String partes1[] = linea.split("Departamento: ");
partes1[0] += "Departamento: ";
String[] partes2 = partes1[1].split(" Salario:");
partes2[0] = departamento;
partes2[1] = " Salario:"+salario;
encontrado = true;
lineaNew = partes1[0] + partes2[0] + partes2[1];
lineaOld = linea;
//A PARTIR DE AQUI VIENE EL LIO
//Averiguo si la linea nueva es mas corta que la vieja
delStrSize = lineaOld.length() - lineaNew.length();
//Y si es asi, añado espacios hasta que midan lo mismo y asi "no se nota"
if(delStrSize > 0){
for(int i = 0; i < delStrSize; i++){
lineaNew += " ";
}
}
}
linea = raf.readLine();
}
raf.close();
if(!encontrado){
System.out.println("No se encontró al empleado con la ID: "+id);
//Ahora accedo en modo lectura/escritura
}else{
raf = new RandomAccessFile(archivo, "rw");
linea = raf.readLine();
while(linea != null){
//Si encuentro el registro que busco...
if(linea.contains(lineaOld)){
//Me pongo al principio de la linea
raf.seek(0);
//Y escribo la nueva linea
//PERO ESTO ME SUPONE 2 PROBLEMAS:
// - si la linea nueva es mas corta he añadido espacios que no quiero añadir
// - y si es mas larga, se come parte de la linea siguiente
raf.writeBytes(lineaNew);
}
linea = raf.readLine();
}
raf.close();
}
}
} catch (IOException e) {
System.out.println("Error I/O: "+e);
}
}
All the best! g.
The following solution uses a temporary file to update the line to be replaced, then the original file is replaced with the temporary one: