Unir contenido de dos txt en un txt nuevo

Iniciado por thebus4k, 9 Mayo 2020, 18:03 PM

0 Miembros y 1 Visitante están viendo este tema.

thebus4k

Hola a todos.
Tengo un problema en un programa que debe unir el contenido de dos archivos txt en un archivo nuevo. El programa que tengo es que me crea bien el archivo, pero no copia el contenido de los dos archivos iniciales.

Código:

import java.io.*;
import javax.swing.JOptionPane;
public class Ejercicio3{

    public static void main(String[] args) {

        //Introducimos los datos
        String rutaFichero1=JOptionPane.showInputDialog("Indica la ruta del primer fichero");
        String rutaFichero2=JOptionPane.showInputDialog("Indica la ruta del segundo fichero");
        String rutaDestino=JOptionPane.showInputDialog("Indica la ruta donde quieres guardarlo");

        //Creamos dos objetos File para que nos sea mas sencillo manejarlos
        File fichero1=new File(rutaFichero1);
        File fichero2=new File(rutaFichero2);

        //Troceamos el el nombre del primer fichero para que se quede sin extension
        String primerFichero=fichero1.getName().substring(0, fichero1.getName().length()-4);

        //Crear el nombre de salida del fichero
        String nombreFicheroFinal=primerFichero+"_"+fichero2.getName();

        rutaDestino+=nombreFicheroFinal;

        File destino=new File(rutaDestino);

        UneFicheros(fichero1, fichero2, destino);

    }

    public static void UneFicheros (File fich1, File fich2, File destino){

        try (BufferedReader br=new BufferedReader(new FileReader(fich1));
            BufferedReader br2=new BufferedReader(new FileReader(fich2))){

            int eleccion=-1;

            if(destino.exists()){
                eleccion=JOptionPane.showConfirmDialog(null, "El fichero ya existe, ¿Quieres sobrescribir el fichero "+destino.getName()+"?",
                        "Sobrescribir",
                        JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
            }
            if(eleccion!=JOptionPane.CANCEL_OPTION){

                /*
                 * Lo creamos aquí, ya que si lo hacemos arriba
                 * siempre existira porque se crea al abrir el Stream
                 */

                BufferedWriter bw=new BufferedWriter(new FileWriter(destino));

                //Copiamos el contenido al fichero destino
                copiar(bw, br);
                copiar(bw, br2);

            }
        }catch(IOException e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }

    }

    private static void copiar(BufferedWriter bw, BufferedReader br) throws IOException{

            String linea=br.readLine();
            while(linea!=null){

                bw.write(linea);

                linea=br.readLine();
            }

    }
}



Espero que alguien sepa ayudarme, un saludo.

EdePC

Saludos,

- Te falta cerrar tu Buffer:

Cita de: Del libro adjunto, pág.: 159Es importante ejecutar close() después de realizar la escritura; de esta manera nos
aseguramos que se graba toda la información en el disco.

Libro Aprende Java con más de 200 ejercicios (Luis José Sánchez González, 2016)
https://www.academia.edu/36088785/Aprende_java_con_ejercicios


rub'n

#2
* Ligero cambio, y es verdad cierra los recursos asi como haces con BufferedReader dentro del try-with-resources
* Crea el fichero destino si no existe
* Hardcodear las rutas asi es un fastidio, usa mejor JFileChooser


Código (java) [Seleccionar]
public class Ejercicio3 {

   public static void main(String[] args) {

       //Harcodear la ruta no esta bien, evitar en lo posible a menos que sea una ruta fija siempre

       //Introducimos los datos
       String rutaFichero1 = JOptionPane.showInputDialog("Indica la ruta del primer fichero");
       String rutaFichero2 = JOptionPane.showInputDialog("Indica la ruta del segundo fichero");
       String rutaDestino = JOptionPane.showInputDialog("Indica la ruta donde quieres guardarlo");

       //Creamos dos objetos File para que nos sea mas sencillo manejarlos
       File fichero1 = new File(rutaFichero1);
       File fichero2 = new File(rutaFichero2);

       //Troceamos el el nombre del primer fichero para que se quede sin extension
       String primerFichero = fichero1.getName().substring(0, fichero1.getName().length() - 4);

       //Crear el nombre de salida del fichero
       String nombreFicheroFinal = primerFichero + "_" + fichero2.getName();

       //invocando a .replaceAll() quitando null en caso que no coloquen nombre de Archivos
       rutaDestino += nombreFicheroFinal.replace("null", "");

       //ruta escrita por el usuario
       File destino = new File(rutaDestino.replaceAll("null", ""));
       uneFicheros(fichero1, fichero2, destino);

   }

   public static void uneFicheros(File fich1, File fich2, File destino) {

       try (BufferedReader br = new BufferedReader(new FileReader(fich1));
            BufferedReader br2 = new BufferedReader(new FileReader(fich2))) {

           int eleccion = -1;

           if (destino.exists()) {
               eleccion = JOptionPane.showConfirmDialog(null, "El fichero ya existe, ¿Quieres sobrescribir el fichero " + destino.getName() + "?",
                       "Sobrescribir",
                       JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
           }
           if (eleccion != JOptionPane.CANCEL_OPTION) {

               /**
                * creando el fichero destino si no existe
                */
               Files.createFile(destino.toPath());


               /*
                * Lo creamos aquí, ya que si lo hacemos arriba
                * siempre existira porque se crea al abrir el Stream
                */
               copiar(br, br2, destino.toPath());
           }
       } catch (IOException e) {
           JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
       }

   }

   private static void copiar(final BufferedReader br, final BufferedReader br2, final Path destino) {

       //Recorremos el Stream para hacer una reduccion en String con el separador del sistema
       String lines = br.lines().collect(Collectors.joining(System.lineSeparator()));
       String lines2 = br2.lines().collect(Collectors.joining(System.lineSeparator()));

       try (final BufferedWriter bw = Files.newBufferedWriter(destino)) {

           //escribimos la concatenacion de ambos String
           bw.write(lines.concat(lines2));

       } catch (IOException ex) {
           ex.printStackTrace();
       }

   }
}


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen