2010-03-26 26 views
14

Tengo dos objetos Java.io.File file1 y file2. Quiero copiar el contenido del archivo1 al archivo2. ¿Hay una manera estándar de hacer esto sin tener que crear un método que lea el archivo1 y escriba en el archivo2Java IO para copiar un archivo en otro

+4

Ver http://stackoverflow.com/questions/106770/standard-concise-way-to-copy-a-file-in-java – TwentyMiles

Respuesta

24

No, no hay un método incorporado para hacerlo. El más cercano a lo que se quiere lograr es el método de transferFromFileOutputStream, así:

FileChannel src = new FileInputStream(file1).getChannel(); 
    FileChannel dest = new FileOutputStream(file2).getChannel(); 
    dest.transferFrom(src, 0, src.size()); 

y no se olvide de manejar excepciones y cerca de todo en un bloque finally.

+3

Whoah. Tú me has enseñado. –

+0

Una versión más completa (y correcta) de esta respuesta está disponible aquí: http://stackoverflow.com/questions/106770/standard-concise-way-to-copy-a-file-in-java/115086#115086. Gracias a http://stackoverflow.com/users/92937/twentymiles por enseñarnos a todos. – vkraemer

+0

Respuesta completa y eficiente: https://gist.github.com/mrenouf/889747 –

6

No. Cada programador de Java desde hace mucho tiempo tiene su propio cinturón de herramientas que incluye dicho método. Aquí está el mío.

public static void copyFileToFile(final File src, final File dest) throws IOException 
{ 
    copyInputStreamToFile(new FileInputStream(src), dest); 
    dest.setLastModified(src.lastModified()); 
} 

public static void copyInputStreamToFile(final InputStream in, final File dest) 
     throws IOException 
{ 
    copyInputStreamToOutputStream(in, new FileOutputStream(dest)); 
} 


public static void copyInputStreamToOutputStream(final InputStream in, 
     final OutputStream out) throws IOException 
{ 
    try 
    { 
     try 
     { 
      final byte[] buffer = new byte[1024]; 
      int n; 
      while ((n = in.read(buffer)) != -1) 
       out.write(buffer, 0, n); 
     } 
     finally 
     { 
      out.close(); 
     } 
    } 
    finally 
    { 
     in.close(); 
    } 
} 
+0

Sin copyFileToInputStream? –

+0

Esto fue un * extracto *. :) –

21

Si quieres ser perezoso y salirse con la escritura de código mínimo uso FileUtils.copyFile(src, dest) de Apache IOCommons

+1

¡Este es el camino a seguir! –

+1

Soy un fanático del código mínimo. No estoy seguro de por qué es "flojo" usar un paquete de utilidad. Me encanta StringUtils. –

6

Desde Java 7 puede usar Files.copy() de la biblioteca estándar de Java.

Se puede crear un método de envoltura:

public static void copy(String sourcePath, String destinationPath) throws IOException { 
    Files.copy(Paths.get(sourcePath), new FileOutputStream(destinationPath)); 
} 

que se puede utilizar de la siguiente manera:

copy("source.txt", "dest.txt"); 
0

En Java 7 puede utilizar Files.copy() y muy importante es: Do no olvide cerrar el OutputStream después de crear el nuevo archivo.

OutputStream os = new FileOutputStream(targetFile); 
Files.copy(Paths.get(sourceFile), os); 
os.close(); 
Cuestiones relacionadas