Programación Java - Copiar archivos, directorios y sustituir strings en ficheros

sábado, 27 de febrero de 2010

Hace poco he necesitado poder copiar archivos de texto en Java. Tras varias búsquedas fallidas en Google, ya que la mayoría de soluciones proponían usar el comando "Runtime.exec", que llama a comandos ms-dos para copiar los archivos, lo cual lo hace dependiente del sistema operativo y además le quita la característica multiplataforma a Java.
Como ninguno de los resultados obtenidos me daba la solución que quería exactamente, me decidí a crear mi propia solución cogiendo diferentes ejemplos de Internet.
Esta clase que os propongo tiene tres funciones:
  1.  copyDirectory: Pasándole dos directorios, el de origen y destino, copia todos los ficheros del primero al segundo. Para ello usa la siguiente función. Ejemplo de uso: copyDirectory(new File("directorio_origen"), new File("directorio_destino"));
  2. copyFile: Copia el archivo de origen en uno de destino. No es necesario que el archivo de destino exista ya que si no existe lo genera al vuelo. Ejemplo de uso: copyFile(new File("archivo_origen"), new File("archivo_destino"));
  3. copyFindAndReplace: Esta última copia el archivo de origen en el lugar de destino, pero además busca sustituye el String indicado por el otro indicado en todos el fichero. Ejemplo de uso: copyFindAndReplace(new File("archivo_origen"), new File("archivo_destino"), "StringABuscar", "StringParaSustituir");
Si quieres ver el código sigue leyendo.


/**
 *
 * @author www.nosolounix.com
 */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;


public class Copy{

    public Copy() {
    }

    /**
     * Copia todo el contenido de un directorio a otro directorio
     * @param srcDir
     * @param dstDir
     * @throws IOException
     */
    public void copyDirectory(File srcDir, File dstDir)
    {
        try{
            if (srcDir.isDirectory()) {
                if (!dstDir.exists()) {
                    dstDir.mkdir();
                }

                String[] children = srcDir.list();
                for (int i=0; i
                    copyDirectory(new File(srcDir, children[i]),
                        new File(dstDir, children[i]));
                }
            } else {
                copyFile(srcDir, dstDir);
            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    /**
     * Copia un solo archivo
     * @param s
     * @param t
     * @throws IOException
     */
    public void copyFile(File s, File t)
    {
        try{
              FileChannel in = (new FileInputStream(s)).getChannel();
              FileChannel out = (new FileOutputStream(t)).getChannel();
              in.transferTo(0, s.length(), out);
              in.close();
              out.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    /**
     * Copia un archivo y busca y sustituye un String dado
     * @param source_file
     * @param destination_file
     * @param toFind
     * @param toReplace
     * @throws IOException
     */
    public void copyFindAndReplace(String source_file, String destination_file, String toFind, String toReplace)
    {
        String str;
        try{
            FileInputStream fis2 = new FileInputStream(source_file);
            DataInputStream input = new DataInputStream (fis2);
            FileOutputStream fos2 = new FileOutputStream(destination_file);
            DataOutputStream output = new DataOutputStream (fos2);

            while (null != ((str = input.readLine())))
            {
                String s2=toFind;
                String s3=toReplace;

                int x=0;
                int y=0;
                String result="";
                while ((x=str.indexOf(s2, y))>-1) {
                    result+=str.substring(y,x);
                    result+=s3;
                    y=x+s2.length();
                }
                result+=str.substring(y);
                str=result;

                if(str.indexOf("'',") != -1){
                    continue;
                }
                else{
                    str=str+"\n";
                    output.writeBytes(str);
                }
            }
        }
        catch (IOException ioe)
        {
            System.err.println ("I/O Error - " + ioe);
        }
    }
}
Basada en esta clase.

Artículos relacionados


Comments

8 Responses to “ Programación Java - Copiar archivos, directorios y sustituir strings en ficheros ”
Post a Comment | Enviar comentarios ( Atom )

Anónimo dijo...

Hola Si pudieras colocar algo de como dibujar arboles en java. Ejemplo insertar los datos que querramos y que estos lo podamos ver en un JFrame con sus respectivos nodos para luego hacerle al arbol un recorrido x.

28 de mayo de 2010, 18:04
Anónimo dijo...

hay un error, no cierras el bucle for en donde copia todo el directorio

24 de noviembre de 2010, 20:09
Eric dijo...

Evidentemente no me lo generó al vuelo :S

Copy.copyFile(archivoLiquidacionSeleccionado, new File("/srv/nikant/liquidacionProveedores/ar1.pdf"));

java.io.FileNotFoundException: /srv/nikant/liquidacionProveedores/ar1.pdf (No such file or directory)

14 de julio de 2011, 23:25
Anónimo dijo...

Al probar con el método copyFile me arrojó la excepción de acceso denegado... como puedo solucionarlo?

31 de agosto de 2011, 10:07
Anónimo dijo...

Si vas a copiar clases de otro lado al menos dale crédito a los que la crearon.... está clase está en otra página, completa y sin errores (de sintaxis al menos) >.>

http://www.forosdelweb.com/1638941-post41.html

Por si alguno tiene el mismo problema

7 de noviembre de 2011, 16:45
Anónimo dijo...

Que chorro, ladrón... Encima mal robado...
http://www.forosdelweb.com/1638941-post41.html

17 de noviembre de 2011, 9:02
Marta dijo...

Realmente no recuerdo en que web encontré la base para crear esta clase, y aunque las dos primeras funciones si que son iguales que la fuente que comentais, podreis ver que hay una nueva función que añade funcionalidad a la clase.

Por lo tanto, pido disculpas por la falta de referencias, pero pasó mucho tiempo desde que cree la clase hasta que escribí el post, de todas formas incluyo la referencia para que nadie más se sienta ofendido.

Saludos!

17 de noviembre de 2011, 18:01

Excelente compañero, Gracias!

28 de mayo de 2013, 15:02

Publicar un comentario en la entrada

Deja tu opinión realizando un comentario interesante. Cualquier intento de Spam no será admitido.