Solución al reto de archivo de acceso aleatorio

Como todos los viernes, solución al reto planteado. Hoy resuelvo el reto de acceso aleatorio (puedes pulsar aquí para recordar).

Como puede hacerse

En primer lugar, se crea un flujo de lectura y escritura sobre el nombre del archivo recibido por parámetro. Alternativamente, se van leyendo del archivo los precios y referencias almacenados en él, y se procede a calcular la actualización del precio. Para reemplazar el precio leído por el actualizado se utiliza el método seek() para situarnos en la posición anterior al último precio leído. Para determinar dicha posición se utiliza el método getFilePointer(), que proporciona la posición actual del puntero de lectura/escritura sobre el archivo y a este valor se le restan 8 posiciones correspondientes al número de bytes que ocupa cada valor de tipo double. Es importante tener en cuenta que estos desplazamientos del archivo se realizan en términos de bytes.  A continuación, se escribe sobre el archivo el precio actualizado. Las excepciones que hay que utilizar, no las olvides.

Parámetros

Nombre del archivo cuyos precios van a ser actualizados.

Valor de retorno

No es necesario

Solución

import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RetoAccesoAleatorio {

public void actualizarArchivoPrecios(String nombreArchivo) {
int referencia;
double precio;
boolean finArchivo = false;
RandomAccessFile archivo = null;

try {
archivo = new RandomAccessFile(nombreArchivo, “rw”);
do {
try {
referencia = archivo.readInt();
precio = archivo.readDouble();
if (precio >= 100) {
precio = precio * 0.80;
} else {
precio = precio * 1.25;
}
// ES NECESARIO RETROCEDER EL PUNTERO SOBRE EL ÚLTIMO PUNTO
// LEIDO
// PARA ELLO SE RETROCEDEN 8 POSICIONES CORRESPONDIENTES AL
// NUMERO DE BYTES
// QUE OCUPA UN VALOR DOUBLE

archivo.seek(archivo.getFilePointer() – 8);
archivo.writeDouble(precio);

} catch (EOFException ex) {
finArchivo = true;
archivo.close();
}
} while (!finArchivo);
} catch (

FileNotFoundException e)

{
System.out.println(“No se encontro el archivo”);
} catch (

IOException ex)

{
System.out.println(“Error de lectura o escritura”);
}

}
}

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s