entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Escribir archivo en JAVA

Buenas tardes compañeros, tengo un pequeño "problema" al realizar una sobre escritura en JAVA, explico: Trato de hacer que al leer el archivo se guarde en un String y mediante un StringBuilder, añadir los datos recogidos de un JTextField y a su vez, tener el contenido del archivo en cuestión. Mi problema viene al proceder a la lectura del archivo, que por alguna razón no la hace.

File fichero = new File ("C:\\prueba.txt");
    StringBuilder contenido = new StringBuilder();
                try {
                    BufferedReader br = new BufferedReader(new FileReader(fichero));
                    try {
                        String linea = null;
                        //Comparo que el String al tener la ruta del archivo entre en el bucle para empezar su lectura linea a linea
                        while ((linea = br.readLine()) != null){
                            contenido.append(linea); //Añado el contenido de linea (contenido del archivo) al String "contenido"
                            System.out.println("Dentro del bucle");
                        }
                        System.out.println("Fuera del bucle");
                        if (null !=br){
                            br.close();
                        }
                        System.out.println(contenido);
                        //Añado el contendo recogidos de los JTextField al StringBuilder "contenido"
                        String field = alias+":"+usuario+":"+clave+":"+host+":"+puerto+":"+nombrebd;
                        contenido.append(field);
                        System.out.println(contenido);
                        //Cambia el contenido de un archivo de texto en su totalidad.. sobreescribiendo el texto existente
                        BufferedWriter output = new BufferedWriter(new FileWriter(fichero));
                        try {
                            output.write(contenido.toString());
                            }finally {
                              output.close();
                            }
                    }catch (Exception ex){
                        System.out.println(ex);
                        br.close();
                        }
                }catch (IOException ex){
                    ex.printStackTrace();
                    }
            }

El problema que me da es que cuando recoge el archivo me da una referencia de null...y no entiendo porque...

0voto

carlossevi comentado

¿En qué línea se produce el fallo? ¿No tienes más información?

0voto

Yesod comentado

http://www.anony.ws/i/2014/07/26/Capturadepantalla2014-07-2619.06.49.png

Me da null en la linea donde esta en BufferReader bf = new BufferReader, que me toma el valor como null...

Aqui tienes una captura del debug del programa...a ver si me puedes explicar porque falla :D

0voto

Peter comentado

@Yesod, moví tu respuesta a comentario, porque no es una respuesta a tu pregunta.

Saludos.

0voto

Yesod comentado

ah vale XDDD es la primera que uso esta red :D

0voto

Peter comentado

No pasa nada :)

0voto

carlossevi comentado

La línea que comentas de BufferReader br = new BufferReader(...) debe ser correcta porque en el debbuger se ve como la variable br está bien declarada aparentemente. Lo que se vuelve null es la linea, pero ¿Se vuelve null en la primera iteración del bucle o cuando ha terminado de leer todo el fichero?

0voto

Yesod comentado

Directamente ni entra en el bucle...(perdona la expresión, pero llevo 1 semana con esto) T_T

0voto

carlossevi comentado

Pues así a simple vista no encuentro el fallo. Tu código es prácticamente igual al de este ejemplo con la diferencia del contructor utilizado para el FileReader. Tu utilizas un File creado anteriormente y él directamente la ruta del archivo, pero debe tener el mismo efecto.

Lógicamente doy por hecho que has descartado problemas de acceso al fichero y has comprobado que el fichero tiene líneas ¿no?

0voto

Yesod comentado

Si, el acceso al archvo funciona porque por lo menos lo escribe...llevo ya un tiempo intentando ver el problema y mirando por la red, pero no doy con ello...

2 Respuestas

2votos

xabe Puntos2180

Hola

Prueba este codigo a mi me funciona

//Declaro e inicio el prodecimiento lectura/escritura del archivo en cuestión
        File fichero = new File ("C:\\prueba.txt");
        System.out.println(fichero);        
        //Compruebo si el fichero en cuestión existe
        String linea= alias+":"+usuario+":"+clave+":"+host+":"+puerto+":"+nombrebd;
        BufferedWriter output = null;
        try
        {
            if (!fichero.exists())
            {
                //Instancio la escritura del archivo en cuestión y le imprimo en su interior las variables
                fichero.createNewFile();                
            }

            output = new BufferedWriter(new FileWriter((fichero), true));  

            // Abrir el fichero añadiendo elementos al final:
            // Generar texto a añadir:  
            // Añadir el texto:
            output.append(linea);
            // Añadir salto de línea (opcional):
            output.append(System.getProperty("line.separator"));
            JOptionPane.showMessageDialog(null, "Guardado correctamente");

        }catch(Exception e){
            e.printStackTrace();
        }
        finally 
        {
           try 
           {
               //Nuevamente aprovechamos el finally para asegurarnos que se cierra el fichero.
               output.flush();
               if (null != output)
               {
                   output.close();
               }
           } catch (Exception e2) { }
        }

0voto

Yesod comentado

Funciona a la perfección!! Gracias compañero!!! :D

¿Como os puedo dar puntos positivos por vuestra ayuda?

0voto

Peter comentado

@Yesod Le das a la flecha verde hacia arriba para puntos. Y si esta es la solución, por favor selecciona la respuesta como correcta.

0voto

Yesod comentado

Hecho, gracias :)

0voto

Peter comentado

De nada, ya quedó :)

2votos

carlossevi Puntos63580

Ya que no conseguimos dar con el error de porqué no eres capaz de leer el fichero, voy a darle la vuelta a tu pregunta: ¿para qué quieres leer el fichero?

Viendo tu código, lo que hace es:

  1. Leer el fichero
  2. Añadirle un texto al final
  3. Guardar el nuevo contenido sobreescribiendo lo anterior

¿Por qué no abrir el fichero para escritura en modo "añadir al final"?

El constructor de la clase FileWriter es así: FileWriter(File file, boolean append) con lo que creo que tu script se puede simplificar de la siguiente manera:

// Abrir el fichero añadiendo elementos al final:
BufferedWriter output = new BufferedWriter(new FileWriter(fichero), true);

// Generar texto a añadir:
String field = alias+":"+usuario+":"+clave+":"+host+":"+puerto+":"+nombrebd;

// Añadir el texto:
output.append(field);

// Añadir salto de línea (opcional):
output.append(System.getProperty("line.separator"));

// Cerrar:
output.flush();
output.close();

No he añadido la estructura de try, catch y finally para que quede más limpio.

1voto

Yesod comentado

Me gusta la idea, pensé en hacerlo así porque no sabía como hacerlo y pues bueno, decidí eso: leer el contenido, guardarlo en un string y mediante un stringbuilder, añadirlo al archivo todo junto.

Probaré lo que me has dicho, a ver si funciona :)

EDITO: Me ha quedado asi, dime si es correcto:

import java.io.*;

import javax.swing.JOptionPane;

public class EscribeFichero {
static String usuario, host, puerto, nombrebd, alias, clave;
//static String clave = new String(AñadirConexion.passwordField.getPassword());

public EscribeFichero() throws IOException {
    initComponents();
}
@SuppressWarnings("resource")
private void initComponents() throws IOException {
    //Sacar la clave desde el JPasswordField
    clave = new String(AñadirConexion.passwordField.getPassword());
    //Recojo el texto introducido en las cajas de texto
    usuario=AñadirConexion.UsuarioField.getText();
    host=AñadirConexion.HostField.getText();
    puerto=AñadirConexion.PuertoField.getText();
    nombrebd=AñadirConexion.BDField.getText();
    alias=AñadirConexion.AliasField.getText();
    //Declaro e inicio el prodecimiento lectura/escritura del archivo en cuestión
    File fichero = new File ("C:\\prueba.txt");
    System.out.println(fichero);
    PrintWriter pw = new PrintWriter(fichero);
    FileWriter fw = new FileWriter((fichero), true);
    //Compruebo si el fichero en cuestión existe
    if (!fichero.exists()){
        try{
            //Instancio la escritura del archivo en cuestión y le imprimo en su interior las variables
            new FileWriter(fichero);
            pw.println(alias+":"+usuario+":"+clave+":"+host+":"+puerto+":"+nombrebd);
            JOptionPane.showMessageDialog(null, "Guardado correctamente");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
           try {
           //Nuevamente aprovechamos el finally para asegurarnos que se cierra el fichero.
           if (null != fichero)
              fw.close();
           } catch (Exception e2) {
              e2.printStackTrace();
           }
        }
    }else{
        // Abrir el fichero añadiendo elementos al final:
        BufferedWriter output = new BufferedWriter(fw);
        try {
            // Generar texto a añadir:
            String field = alias+":"+usuario+":"+clave+":"+host+":"+puerto+":"+nombrebd;

            // Añadir el texto:
            output.append(field);

            // Añadir salto de línea (opcional):
            output.append(System.getProperty("line.separator"));
        }catch (Exception e){
            System.out.println(e);
            output.close();
        }finally{
            // Cerrar:
            output.flush();
            output.close();
        }
    }
}
public static void main(String[] args) throws IOException{
    new EscribeFichero();
}

}

PD: He probado el código y solo escribe el fichero, lo que hubiese antes no se guarda...

PD2: También he probado a hacer un do...while, y nada...

try {
                    String linea = br.readLine();
                    //Comparo que el String al tener la ruta del archivo entre en el bucle para empezar su lectura linea a linea
                    do {
                        contenido.append(linea); //Añado el contenido de linea (contenido del archivo) al String "contenido"
                        System.out.println("Dentro del bucle");
                    }while (linea != null);
                    System.out.println("Fuera del bucle");
                    if (null !=br){
                        br.close();
                    }
                    System.out.println(contenido);
                    //Añado el contendo recogidos de los JTextField al StringBuilder "contenido"
                    String field = alias+":"+usuario+":"+clave+":"+host+":"+puerto+":"+nombrebd;
                    contenido.append(field);
                    System.out.println(contenido);
                    //Cambia el contenido de un archivo de texto en su totalidad.. sobreescribiendo el texto existente
                    BufferedWriter output = new BufferedWriter(new FileWriter(fichero));
                    try {
                        output.write(contenido.toString());
                        }finally {
                          output.close();
                        }
                }catch (Exception ex){
                    System.out.println(ex);
                    br.close();
                    }
            }catch (IOException ex){
                ex.printStackTrace();
                }

0voto

carlossevi comentado

Tienes mal definido el BufferedWriter, te falta añadir el segundo parámetro que indica que el texto se añade al final del fichero:

BufferedWriter output = new BufferedWriter(fw);
// Cambiar por:
BufferedWriter output = new BufferedWriter(fw,true);

0voto

Yesod comentado

Ah leche! XDDD vale! Ya lo tengo, tengo ambos ejemplos :D

Muchas gracias a ambos :D

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta