Ejercicio Tercer Parcial - Problema 2. Persistencia de Prod… · Programació II UDL 2010

Tema: Ficheros en Java: texto secuencial y acceso directo binario · Del examen Exámenes de Recuperación y Tercer Parcial de Programación 2 (Curso 2010/2011) (2010)

Enunciado

Tercer Parcial - Problema 2. Persistencia de Product e inversión de fichero

Considérese la clase Product que modela los artículos de un inventario:

public class Product {

public static final int SIZE = /* ¿ ? */;

private int type;

private long code;

private double price;

private String description;

public Product(int type, long code, double price, String descr) {

this.type = type;

this.code = code;

this.price = price;

this.description = descr;

}

//...

public byte[] toByteArray() { /* ¿ ? */ }

public static Product fromByteArray(byte[] record) { /* ¿ ? */ }

}

Para almacenar instancias de esta entidad en un fichero de acceso directo ( RandomAccessFile), se debe definir una longitud fija por registro y utilizar métodos de empaquetado/desempaquetado a bajo nivel con la clase de utilidades PackUtils.

byte

char

int

long

float

double

8 bits (1 B)

16 bits (2 B)

32 bits (4 B)

64 bits (8 B)

32 bits (4 B)

64 bits (8 B)

Considerando una longitud máxima para la cadena description de 30 caracteres (utilizando packLimitedString y unpackLimitedString, ocupando 2 bytes por carácter):

a)

Determinar el valor exacto de la constante SIZE en bytes e implementar los métodos toByteArray() y fromByteArray(byte[] record).

b)

Escribir un programa que reciba un fichero de acceso aleatorio con registros de productos consecutivos (sin huecos) y lo invierta in situ (el primer producto pasa al último lugar, el segundo al penúltimo, y así sucesivamente).

Enunciado: Ejercicio Tercer Parcial - Problema 2. Persistencia de Prod… · Programació II UDL 2010

Solución

Según los criterios oficiales de corrección

a. Determinar el valor exacto de la constante SIZE en bytes

Solución: 80

a. Implementar los métodos toByteArray() y fromByteArray(byte[] record)

Solución: ```java public byte[] toByteArray() { byte[] buffer = new byte[SIZE]; int offset = 0; PackUtils.packInt(this.type, buffer, offset); offset += 4; PackUtils.packLong(this.code, buffer, offset); offset += 8; PackUtils.packDouble(this.price, buffer, offset); offset += 8; PackUtils.packLimitedString(this.description, MAX_DESC_LEN, buffer, offset); return buffer; } public static Product fromByteArray(byte[] record) { int offset = 0; int type = PackUtils.unpackInt(record, offset); offset += 4; long code = PackUtils.unpackLong(record, offset); offset += 8; double price = PackUtils.unpackDouble(record, offset); offset += 8; String descr = PackUtils.unpackLimitedString(MAX_DESC_LEN, record, offset); return new Product(type, code, price, descr); } ```

b. Escribir un programa que reciba un fichero de acceso aleatorio con registros de productos consecutivos (sin huecos) y lo invierta in situ

Solución: ```java import java.io.RandomAccessFile; import java.io.IOException; public class InvertirFicheroProductos { public static void invertir(String nombreFichero) throws IOException { RandomAccessFile raf = new RandomAccessFile(nombreFichero, "rw"); long totalBytes = raf.length(); long numRegistros = totalBytes / Product.SIZE; byte[] bufferI = new byte[Product.SIZE]; byte[] bufferJ = new byte[Product.SIZE]; long i = 0; long j = numRegistros - 1; while (i < j) { // Leer registro i raf.seek(i * Product.SIZE); raf.readFully(bufferI); // Leer registro j raf.seek(j * Product.SIZE); raf.readFully(bufferJ); // Escribir registro j en la posición i raf.seek(i * Product.SIZE); raf.write(bufferJ); // Escribir registro i en la posición j raf.seek(j * Product.SIZE); raf.write(bufferI); i++; j--; } raf.close(); } } ```

La explicación paso a paso, hecha con IA, es Premium. Premium

Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.

‹ Ejercicio Tercer Parcial - Problema 1. Cálculo de áreas de… · 2010

Más ejercicios de Ficheros en Java: texto secuencial y acceso directo binario