M3 - Programació estructurada / Activitats UF3: Fitxers orientats a byte
1. Fes un programa anomenat CopiarFitxerBinari que realitzi una còpia d'un fitxer orientat a byte. El programa primer ha de demanar a l'usuari que introdueixi pel teclat els noms dels fitxers origen i destinació. Un cop fet, ha d'assegurar-se que l'origen existeix i que el destí no (no es vol sobreescriure'l). Finalment, ha de crear un fitxer amb el nom de la destinació que contingui exactament les mateixes dades que el fitxer origen, siguin quines siguin aquestes dades o el seu tipus.
package m3.aleatori.exercicis;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;
public class CopiarFitxerBinari {
public static void main(String[] args) throws IOException {
CopiarFitxerBinari programa = new CopiarFitxerBinari();
programa.inici();
}
public void inici() throws IOException {
//Es llegeix de teclat rutes origen i destinació
Scanner teclat = new Scanner(System.in);
System.out.print("Escriu el nom del fitxer origen: ");
String origen = teclat.nextLine();
File rutaOrigen = new File(origen);
if (rutaOrigen.isFile()) {
System.out.print("Escriu el nom del fitxer destinació: ");
String desti = teclat.nextLine();
File rutaDesti = new File(desti);
if (rutaDesti.isFile()) {
System.out.println("El fitxer destinació ja existeix.");
} else {
ferCopia(rutaOrigen, rutaDesti);
}
} else {
System.out.println("El fitxer origen no existeix.");
}
}
/**
* Copia un fitxer orientat a byte, a partir d'una ruta origen, a una de
* destinació.
*
* @param rutaOrigen Ruta del fitxer origen
* @param rutaDesti Ruta del fitxer destinació
*/
public void ferCopia(File rutaOrigen, File rutaDesti) throws IOException {
RandomAccessFile rafOrigen = new RandomAccessFile(rutaOrigen, "r");
RandomAccessFile rafDesti = new RandomAccessFile(rutaDesti, "rw");
long numBytes = rutaOrigen.length();
for (int i = 0; i < numBytes; i++) {
byte dada = rafOrigen.readByte();
rafDesti.writeByte(dada);
}
rafDesti.setLength(numBytes);
rafOrigen.close();
rafDesti.close();
System.out.println("Copia finalitzada correctament.");
}
}
2. Fes un programa que, donat un fitxer orientat a byte que conté qualsevol nombre de valors reals, els ordeni de menor a major. Aquesta tasca l’ha de dur directament sobre el fitxer, i no pas carregant les dades a un array, ordenant i després escrivint-les de nou al fitxer. Per veure que funciona, fer que mostri per pantalla els valors continguts abans i després de l’ordenació. La tàctica per ordenar serà la següent: per a cada valor del fitxer anirà comparant-lo amb tots els següents i cada vegada que trobi un valor inferior, farà l'intercanvi.
package m3.aleatori.exercicis;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class OrdenaRealsBinaris {
public static void main(String[] args) throws IOException {
OrdenaRealsBinaris programa = new OrdenaRealsBinaris();
programa.inici();
}
public void inici() throws IOException {
File f = new File("Reals.bin");
System.out.println("Contingut original del fitxer:");
mostrarFitxer(f);
ordenarFitxer(f);
System.out.println("-----------------------------");
System.out.println("Contingut ordenat del fitxer:");
mostrarFitxer(f);
}
/**
* Donat un fitxer orientat a byte que conté reals, ordena directament sobre
* el fitxer tots els seus valors, de menor a major.
*
* @param f Ruta al fitxer amb les dades a ordenar
*/
public void ordenarFitxer(File f) throws IOException {
RandomAccessFile raf = new RandomAccessFile(f, "rw");
//Cada real ocupa 8 byes, per tant, cal avançar de 8 en 8
for (long i = 0; i < f.length(); i = i + 8) {
for (long j = i + 8; j < f.length(); j = j + 8) {
//Es llegeix el valor a la posició "i"
raf.seek(i);
double valorI = raf.readDouble();
//Es llegeix el valor a la posició "j"
raf.seek(j);
double valorJ = raf.readDouble();
//Es comparen
if (valorI > valorJ) {
//Si "i" major que "j", s'intercanvien el lloc
raf.seek(i);
raf.writeDouble(valorJ);
raf.seek(j);
raf.writeDouble(valorI);
}
}
}
raf.close();
}
/**
* Donat un fitxer orientat a byte que conté reals, mostra els valors per
* pantalla.
*
* @param f Ruta del fitxer a mostrar
*/
public void mostrarFitxer(File f) throws IOException {
RandomAccessFile raf = new RandomAccessFile(f, "r");
long numReals = f.length() / 8;
for (int i = 0; i < numReals; i++) {
System.out.println(raf.readDouble());
}
raf.close();
}
}
3. Fes un programa que serveixi com a editor de fitxers orientats a byte que contingui només enters. Aquest s'ha de comportar de la manera següent. En iniciar la seva execució, ha de preguntar a l'usuari quin fitxer vol editar, de manera que aquest pugui escriure el nom usant el teclat. Llavors, ha de mostrar el contingut del fitxer per pantalla, distribuït en files de 10 valors. Si el fitxer no existeix, se'n crea un de nou i, en aquest cas, no apareix cap valor, ja que el fitxer és buit. Tot just després dels valors, el programa espera que l'usuari escrigui una comanda, d'entre les següents:
- a valor: afegir aquest valor al final del fitxer.
- d posició: esborrar el valor que hi ha en aquesta posició, comptant que el primer valor es considera en la posició 0. Ara hi ha un valor menys al fitxer.
- x: el programa acaba.
Després d'executar cada comanda, menys la de sortir, es torna a mostrar el contingut del fitxer, de manera que es poden veure els canvis soferts.