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).

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