NIVELL 5 · Sessió 5 · OpenCSV i RandomAccessFile
CSV i accés aleatori
- Missatge
- Manual
- Reptes
- Cartutx
Aquest nivell ja està superat. Pots tornar-lo a jugar, però la puntuació desada no canviarà.
Manual del nivell
Desbloqueja les 3 pàgines del manual per poder jugar. Llegeix-les bé: els reptes en faran preguntes.
Llegir CSV amb OpenCSV
Un split(";") es trenca si un títol porta un punt i coma. OpenCSV entén les cometes: "Baldur's Gate 3; Deluxe" és un sol camp.
CSVParser parser = new CSVParserBuilder().withSeparator(';').withQuoteChar('"').build();
try (Reader r = Files.newBufferedReader(p, StandardCharsets.UTF_8);
CSVReader csv = new CSVReaderBuilder(r).withCSVParser(parser).withSkipLines(1).build()) {
String[] c;
while ((c = csv.readNext()) != null) {
// c[0]..c[6] són els camps de la línia
}
}| Fragment | Què fa |
|---|---|
withSeparator(';') | El catàleg separa els camps amb punt i coma. |
withQuoteChar('"') | El text entre cometes es llegeix com un sol camp, encara que porti ;. |
withSkipLines(1) | Salta la capçalera. |
csv.readNext() != null | Retorna un array de camps per línia i null al final. |
Un CSV brut no ha de fer petar el programa
Cada línia es tracta dins d'un try/catch propi: si falla, es descarta i s'informa, i es continua amb la següent.
- Menys de 7 camps → incompleta.
LocalDate.parsefalla → DateTimeParseException (data mal formada).Double.parseDoublefalla → NumberFormatException.- El record rebutja la nota o les hores → IllegalArgumentException.
RandomAccessFile: registres de mida fixa
Si tots els registres pesen el mateix, es pot saltar directament a qualsevol amb seek(posició), sense llegir els anteriors. Cada registre: id (int, 4 bytes) + títol de 40 caràcters (40 × 2 = 80 bytes) + hores (double, 8 bytes) = 92 bytes. El títol s'omple o es talla fins a 40 caràcters perquè tots pesin igual.
static final int LONG_TITOL = 40;
static final int MIDA_REGISTRE = Integer.BYTES + LONG_TITOL * Character.BYTES + Double.BYTES; // 92
try (RandomAccessFile raf = new RandomAccessFile(fitxer.toFile(), "rw")) {
long posicioHores = 2L * MIDA_REGISTRE + Integer.BYTES + LONG_TITOL * Character.BYTES;
raf.seek(posicioHores);
raf.writeDouble(12.5 + 3.0);
}| Fragment | Què fa |
|---|---|
Character.BYTES | Un char de Java ocupa 2 bytes: 40 caràcters són 80 bytes. |
"rw" | Mode lectura i escriptura (amb "r" només es pot llegir). |
2L * MIDA_REGISTRE + ... | Salta dos registres sencers (el 0 i l'1) i, dins del tercer, l'id i el títol. |
raf.seek(...) | Mou el punter a aquella posició; la següent lectura o escriptura comença allà. |
Nivell superat
Catàleg net i hores restaurades. Tens els cinc cartutxos: el BUG·0x00 t'espera.
- XP guanyats
- 0
- Errors
- 0
- Pistes
- 0
Anota bé la lletra i la seva posició: abans del boss hauràs de reconstruir la contrasenya.