Foro de elhacker.net

Programación => Java => Mensaje iniciado por: thebus4k en 9 Mayo 2020, 18:03 pm



Título: Unir contenido de dos txt en un txt nuevo
Publicado por: thebus4k en 9 Mayo 2020, 18:03 pm
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.


Título: Re: Unir contenido de dos txt en un txt nuevo
Publicado por: EdePC en 9 Mayo 2020, 21:08 pm
Saludos,

- Te falta cerrar tu Buffer:

Cita de: Del libro adjunto, pág.: 159
Es 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



Título: Re: Unir contenido de dos txt en un txt nuevo
Publicado por: rub'n en 10 Mayo 2020, 04:23 am
* 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
  1. public class Ejercicio3 {
  2.  
  3.    public static void main(String[] args) {
  4.  
  5.        //Harcodear la ruta no esta bien, evitar en lo posible a menos que sea una ruta fija siempre
  6.  
  7.        //Introducimos los datos
  8.        String rutaFichero1 = JOptionPane.showInputDialog("Indica la ruta del primer fichero");
  9.        String rutaFichero2 = JOptionPane.showInputDialog("Indica la ruta del segundo fichero");
  10.        String rutaDestino = JOptionPane.showInputDialog("Indica la ruta donde quieres guardarlo");
  11.  
  12.        //Creamos dos objetos File para que nos sea mas sencillo manejarlos
  13.        File fichero1 = new File(rutaFichero1);
  14.        File fichero2 = new File(rutaFichero2);
  15.  
  16.        //Troceamos el el nombre del primer fichero para que se quede sin extension
  17.        String primerFichero = fichero1.getName().substring(0, fichero1.getName().length() - 4);
  18.  
  19.        //Crear el nombre de salida del fichero
  20.        String nombreFicheroFinal = primerFichero + "_" + fichero2.getName();
  21.  
  22.        //invocando a .replaceAll() quitando null en caso que no coloquen nombre de Archivos
  23.        rutaDestino += nombreFicheroFinal.replace("null", "");
  24.  
  25.        //ruta escrita por el usuario
  26.        File destino = new File(rutaDestino.replaceAll("null", ""));
  27.        uneFicheros(fichero1, fichero2, destino);
  28.  
  29.    }
  30.  
  31.    public static void uneFicheros(File fich1, File fich2, File destino) {
  32.  
  33.        try (BufferedReader br = new BufferedReader(new FileReader(fich1));
  34.             BufferedReader br2 = new BufferedReader(new FileReader(fich2))) {
  35.  
  36.            int eleccion = -1;
  37.  
  38.            if (destino.exists()) {
  39.                eleccion = JOptionPane.showConfirmDialog(null, "El fichero ya existe, ¿Quieres sobrescribir el fichero " + destino.getName() + "?",
  40.                        "Sobrescribir",
  41.                        JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
  42.            }
  43.            if (eleccion != JOptionPane.CANCEL_OPTION) {
  44.  
  45.                /**
  46.                  * creando el fichero destino si no existe
  47.                  */
  48.                Files.createFile(destino.toPath());
  49.  
  50.  
  51.                /*
  52.                  * Lo creamos aquí, ya que si lo hacemos arriba
  53.                  * siempre existira porque se crea al abrir el Stream
  54.                  */
  55.                copiar(br, br2, destino.toPath());
  56.            }
  57.        } catch (IOException e) {
  58.            JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
  59.        }
  60.  
  61.    }
  62.  
  63.    private static void copiar(final BufferedReader br, final BufferedReader br2, final Path destino) {
  64.  
  65.        //Recorremos el Stream para hacer una reduccion en String con el separador del sistema
  66.        String lines = br.lines().collect(Collectors.joining(System.lineSeparator()));
  67.        String lines2 = br2.lines().collect(Collectors.joining(System.lineSeparator()));
  68.  
  69.        try (final BufferedWriter bw = Files.newBufferedWriter(destino)) {
  70.  
  71.            //escribimos la concatenacion de ambos String
  72.            bw.write(lines.concat(lines2));
  73.  
  74.        } catch (IOException ex) {
  75.            ex.printStackTrace();
  76.        }
  77.  
  78.    }
  79. }
  80.