Foro sobre Java SE > RE: duda escribir y leer fichero
¿Cuando quiero leer del fichero, tengo que poner tambien el atributo que quiero leer? es la primera clase descripcion? pongo los dos
try{ String linea = br.readLine(descripcion); O como lo tenia sin poner nada ahi
while ( linea != null){
System.out.println(linea);
linea = br.readLine();
}
hola de nuevo, jeje, tienes suerte de que me aburra. a ver mas o menos voy entendiendo lo que quieres hacer, Pero aun no capto la idea general del programa, tu lo que quieres hacer, es un programita al que le digas un fichero y te lea las lineas de ese fichero y te cree un nuevo fichero con una cabecera y con nuevas lineas que tu agregases?
o es un fichero que tu ya tienes creado con esas cabeceras y lees ese fichero?
en cualquier caso un writer y un reader no pueden estar abiertos simultaneamente sobre un mismo fichero.
Por ello lo que tendrás que hacer sera leer todo el fichero y cargarlo en una estructura.
entonces cerraras el reader y modificaras los datos contenidos en esa estructura, es decir trabajaras en memoria sobre las modificaciones que quieras hacerle al fichero, y una vez realizadas las modificaciones, entonces crearas un writer y escribirás en el fichero lo que hay en la estructura, cargándote todo lo que había antes o crearas otro fichero con otro nombre, según lo que necesites hacer.
Yo te recomiendo que crees un método que reciba un reader y que lea el fichero entero almacenandolo en un arraylist o algo así. Una vez que tienes en el array list todas las lineas del fichero. cierra el reader y haz que el metodo te devuelva el arraylist con el contenido del fichero.
El método podría ser algo así..
public ArrayList<String> leerFichero(Reader rd )....
Ahora trabajaras sobre ese arraylist que tiene todo el contenido del fichero, y una vez que termines de trabajar con ese arraylist pues te crearas un metodo que sera escribe a fichero podria ser algo asi...
public void escribeAFichero(writer wr,ArrayList<String> contenido)
cargandote el fichero que tenias anteriormente...
lo de la coleccion de LineaDocumento, si seria correcto pero si lo que quieres es rellenarlo con el contenido de un fichero, debes hacer eso, un metodo que te devuelva una lista de LineaDocumento... el metodo segun tu codigo podria ser algo asi...
public ArrayList<LineaDocumento> leeDeFichero(BufferedReader br)throws IOException{
ArrayList<LineaDocumento> lineas=new ArrayList<LineaDocumento>();
try{ String linea = br.readLine();
while ( linea != null){
LineaDocumento auxLinea=new LineaDocumento(linea);
lineas.add(auxLinea);
linea = br.readLine();
}
}catch(IOException e){
System.out.println("Error E/S: "+e);
}
return lineas;
}
El metodo podria ser algo asi de esa manera lees todas las lineas del fichero y puedes recogerlas para tratarlas mientras que tu lo que haces es simplemente imprimir por pantalla y de esa manera se pieden no se almacenan en ningun sitio.
a ver sobre lo de leer tu fichero es eso es muy importante conocer la estructura que tiene, si tu sabes que la primera es el nombre, la segunda la fecha etc, pues a la hora de leer el fichero tu leeras la primera linea y crearas un string con el nombre
leeeras la segunda y tercera linea, y crearas una fecha o rellenaras los atributos fecha correspondientes y a partir de la tercera linea ya todo lo que leas son las lineas del documento...
pues nada un metodo parecido al de antes pero asi...
public Documento leeDeFichero(BufferedReader br)throws IOException{
ArrayList<LineaDocumento> lineas=new ArrayList<LineaDocumento>();
try{
String nombre=br.readLine();
int fechaM=Integer.valueOf(br.readLine());
int fechaD=Integer.valueOf(br.readLine());
String linea = br.readLine();
while ( linea != null){
LineaDocumento auxLinea=new LineaDocumento(linea);
lineas.add(auxLinea);
linea = br.readLine();
}
}catch(IOException e){
System.out.println("Error E/S: "+e);
}
Documento documento=new Documento(nombre,fechaM,fechaD);
documento.setLineasDocumento(lineas);
return documento;
}
el método setLineasDocumento(lineas); para establecer el atributo lineas del documento.
Bueno espero aclararte un poco las ideas. Con esto tienes para un rato, Un saludo!
y por supuesto tras leer o escribir en los ficheros, debes cerrar los writers y los readers...
La clave esta en almacenar lo que leer el fichero, Almacenar los datos del fichero en algun sitio, cerrar el reader, hacer modificaciones a los datos que hemos recibido del reader, crear un wirter, escribir los datos modificados cargándonos el fichero que había anteriormente...
Hola de nuevo! gracias a la recomendacion de loderain vuelvo a poner la duda que tenía, antes de nada gracias por contestar y ayudarme aunque no estuviera bien planteada la duda.
Primero tengo una clase llamada LineaDocumento esta (pongo el codigo):
import java.io.*;
import java.util.*;
import java.lang.*;
public class LineaDocumento
{
// atributo descripcion tipo cadena de texto
private String descripcion;
//metodos de acceso get y set
public String getDescripcion (){
return descripcion;
}
public void setDescripcion (String descripcion){
this.descripcion = descripcion;
}
//constructor con un parametro el atributo
public LineaDocumento(){
this.descripcion = "vacio";
}
public LineaDocumento (String descripcion){
this.descripcion = descripcion;
}
// constructor copia
//metodo toString
public String toString(){
String mensaje = "Esto es la descripcion " + descripcion;
return mensaje;
}
/* guardar(writer) que recibe un objeto de la jerarquia Writer y escribe una linea de texto con el
valor del atributo*/
public void escribirEnFichero (BufferedWriter bw)throws IOException{
try {bw.write(descripcion);
bw.flush();
}catch (IOException e) {
System.out.println("Error E/S: " + e);
}
}
/* recuperar(Reader) que recibe un objeto de la jerarquia Reader y lee una linea de texto con el
valor del atributo*/
public void leeDeFichero(BufferedReader br)throws IOException{
try{ String linea = br.readLine();
while ( linea != null){
System.out.println(linea);
linea = br.readLine();
}
}catch(IOException e){
System.out.println("Error E/S: "+e);
}
}
}
DUDA: recibo un objeto de la jerarqui qriter y reader en los metodos respectivos, por lo tanto ¿ solo necesito usarlo como lo hago? ¿ tendria que cerrar el fichero? un br.close() y bw.close()?
La siguiente viene con la clase Documento pongo codigo:
import java.util.*;
import java.io.*;
import java.lang.*;
public class Documento
{
//atributos
private String nombre;
private int fechaMes;
private int fechaDia;
ArrayList<LineaDocumento> linea=new ArrayList<LineaDocumento>();
//Metodos de acceso
public String getNombre (){
return nombre;
}
public int getFechaMes (){
return fechaMes;
}
public int getFechaDia (){
return fechaDia;
}
public ArrayList getLinea(){
return linea;
}
public void setDocumento(String nombre){
this.nombre = nombre;
}
public void setFechaMes(int fechaMes){
this.fechaMes = fechaMes;
}
public void setFechaDia(int fechaDia){
this.fechaDia = fechaDia;
}
// Constructor con 3 parametros , uno por atributos , menos para lineas que se creará una vacia
public Documento (String nombre, int fechaMes, int fechaDia){
this.nombre = nombre;
this.fechaMes = fechaMes;
this.fechaDia = fechaDia;
this.linea = null;
}
public Documento(){
this.nombre = " vacio";
this.fechaMes = 0;
this.fechaDia = 0;
this.linea = null;
}
//Constructor copia
//Metodo ToString
public String toString(){
String mensaje = "Nombre " + nombre + "dia mes y linea " + fechaDia + fechaMes + linea;
return mensaje;
}
/* guardar(writer) que recibe un objeto de la jerarquia Writer y escribe una linea de texto por cada atributo y finalmente el atrinuto lineas
llamando a guardar (writer) de la clase LineaDocumento*/
public void escribirEnFicheroe (BufferedWriter bw)throws IOException{
try {bw.write(nombre);
bw.newLine();
bw.write(fechaDia);
bw.newLine();
bw.write(fechaMes);
bw.newLine();
LineaDocumento resto;
resto = new LineaDocumento();
while (linea != null){
resto.escribirEnFichero();
}
bw.flush();
}catch (IOException e) {
System.out.println("Error E/S: " + e);
}
}
}
DUDA: ArrayList<LineaDocumento> linea=new ArrayList<LineaDocumento>(); Aqui he hecho una coleccion de objetos de tipo LineaDocumento, esto seria correcto?
DUDA: como puedo llamar a los metodos escribir y leer (ficheros) de LineaDocumento
para que lo guarde y lea en documento yo tengo puesto llamar al metodo de escribir en fichero pero una vez llamado que debo hacer con el? este es el enunciado.
guardar(writer) que recibe un objeto de la jerarquia Writer y escribe una linea de texto por cada atributo y finalmente el atrinuto lineas.
Gracias de nuevo :D.