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.
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
* 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
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();
}
}
}