Ficheiros de acceso secuencial
Traballar con ficheiros de acceso secuencial
O acceso secuencial é o máis frecuente cando se traballa con ficheiros, e xa coñecemos as características e vantaxes do acceso explicadas no primeiro apartado.
Neste tipo de acceso hai te que ter en conta que debemos coñocer o formato ou estrutura do ficheiro de antemán, e ir procesándoo.
No labor de lectura ou escritura podese traballar a nivel de bytes ou de caracteres. O seguinte exemplo amosa unha posible aplicación liña a liña de ficheiros de texto.
O exemplo é un pequeno programa de produtos e proveedores dunha empresa.
Operacións con acceso secuencial:
Abrir/crear ficheiro: detallado no apartado de ficheiros de texto.
String fichero = "produc.txt"; File f = new File(fichero); FileWriter fw = new FileWriter(f);
Gardar en ficheiro: unha vez aberto unha posibilidade para gardar é usar a clase PrintWriter. O que temos que ter en conta é que o gardar creamos unha estructura ríxida de información/rexistros, que logo vamos a utilizar para ler ou engadir máis rexistros.
Exemplo de gardar os produtos:
PrintWriter escritura = new PrintWriter(fw); for (int i = 0; i < menu.produtos.size(); i++) {
escritura.println(menu.produtos.get(i).imprimeProduto());
} escritura.close(); A información que temos que gardar está nunha colección de obxectos, e a orden de almacenamento dos datos está no método imprimeProducto():
public String imprimeProduto() {
String salidaProducto = codProd + ":" + tipo + ":" + nome + ":" + prezo + ":" + pais + ":";
for (int i = 0; i < this.getCodigoProveedor().size(); i++) {
if (i != 0) {
saidaProduto = saidaProduto.concat(",");
}
saidaProduto= saidaProduto.concat(this.getCodigoProveedor().get(i).getCodProv());
}
return saidaProduto;
}
Ler en ficheiros: este exemplo lee de maneira secuencial e volca toda esta información en obxectos e istos a súa vez introdúcense nunha colección para xestionalos axeitadamente (neste caso ArrayList):
FileReader fr = null;
BufferedReader br = null;
fr = new FileReader("prov.txt");
br = new BufferedReader(fr);
String linea;
String[] items;
while ((linea = br.readLine()) != null) {
items = linea.trim().split(":");
menu.proveedores.add(new Proveedor(items[0], items[1], items[2].toUpperCase()));
}
br.close();
Neste exemplo debemos coñecer como é a estrutura do ficheiro liña a liña; no exemplo cada liña é un proveedor e ten tres datos separados por “:”.
Exemplo completo e enunciado:
Disponse de dous ficheiros de texto “proveedores.txt” e “productos.txt”:
proveedores.txt: cada liña conten a información dun proveedor. Esta componse dos seguintes campos separados por “:”
codProv:nome:enderezo
productos.txt: cada liña conten a información dun produto. Esta componse dos seguintes campos separados por “:”
codProd:tipo:nome:prezo[:pais]:codProv,codProv,codProv
Coma se pode observar, o quinto e o sexto campo da liña está formado a súa vez por unha lista que contén o código dos proveedores que suministran o devandito produto, e estes códigos están separados polo carácter “,”. Existen dous tipos de produtos: con “n” é nacional, e con “i” internacional. Se é internacional o producto terá un campo máis que é o país de orixe.
A partires destos ficheiros crear os obxectos precisos, cunha arquitectura O.O. correcta.
Crea un programa con estas funcionalidades:
- Engadir un producto.
- Obter un total do facturado por parte dun proveedor.
- Engadir proveedor a un determinado producto.
- Gardar os cambios nos correspondentes ficheiros.
Copia de seguridade: pidénnos que gardemos en ficheiros binarios a información de proveedores como de productos. Estos ficheiros con extensión .dat.
Solución: unidad1.actividade.secuencial