otra directorio copiar con carpeta archivo recursion java-8 file-copying

recursion - con - Java 8: ¿Copiar directorio recursivamente?



copiar directorio java (5)

Veo que Java 8 ha limpiado significativamente la lectura del contenido de un archivo en una cadena:

String contents = new String(Files.readAllBytes(Paths.get(new URI(someUrl))));

Me pregunto si hay algo similar (más limpio / menos código / más conciso) para copiar directorios de forma recursiva. En la tierra de Java 7, sigue siendo algo como:

public void copyFolder(File src, File dest) throws IOException{ if(src.isDirectory()){ if(!dest.exists()){ dest.mkdir(); } String files[] = src.list(); for (String file : files) { File srcFile = new File(src, file); File destFile = new File(dest, file); copyFolder(srcFile,destFile); } } else { InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0){ out.write(buffer, 0, length); } in.close(); out.close(); } }

¿Alguna mejora aquí en Java 8?


¿Qué tal el siguiente código?

public void copyFolder(File src, File dest) throws IOException { try (Stream<Path> stream = Files.walk(src.toPath())) { stream.forEachOrdered(sourcePath -> { try { Files.copy( /*Source Path*/ sourcePath, /*Destination Path */ src.toPath().resolve(dest.toPath().relativize(sourcePath))); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }); } }


De esta manera el código se ve un poco más simple.

public void copyFolder(Path src, Path dest) throws IOException { Files.walk(src) .forEach(source -> copy(source, dest.resolve(src.relativize(source)))); } private void copy(Path source, Path dest) { try { Files.copy(source, dest, REPLACE_EXISTING); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } }


Esta versión usa los parámetros Files.walk y Path como sugiere Java 8.

public static void copyFolder(Path src, Path dest) { try { Files.walk( src ).forEach( s -> { try { Path d = dest.resolve( src.relativize(s) ); if( Files.isDirectory( s ) ) { if( !Files.exists( d ) ) Files.createDirectory( d ); return; } Files.copy( s, d );// use flag to override existing } catch( Exception e ) { e.printStackTrace(); } }); } catch( Exception ex ) { ex.printStackTrace(); } }


mi version:

static private void copyFolder(File src, File dest) { // checks if(src==null || dest==null) return; if(!src.isDirectory()) return; if(dest.exists()){ if(!dest.isDirectory()){ //System.out.println("destination not a folder " + dest); return; } } else { dest.mkdir(); } if(src.listFiles()==null || src.listFiles().length==0) return; for(File file: src.listFiles()){ File fileDest = new File(dest, file.getName()); //System.out.println(fileDest.getAbsolutePath()); if(file.isDirectory()){ copyFolder(file, fileDest); }else{ if(fileDest.exists()) continue; try { Files.copy(file.toPath(), fileDest.toPath()); } catch (IOException e) { //e.printStackTrace(); } } } }


y una versión más:

static void copyFolder(File src, File dest){ // checks if(src==null || dest==null) return; if(!src.isDirectory()) return; if(dest.exists()){ if(!dest.isDirectory()){ //System.out.println("destination not a folder " + dest); return; } } else { dest.mkdir(); } if(src.listFiles()==null || src.listFiles().length==0) return; String strAbsPathSrc = src.getAbsolutePath(); String strAbsPathDest = dest.getAbsolutePath(); try { Files.walkFileTree(src.toPath(), new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { File dstFile = new File(strAbsPathDest + file.toAbsolutePath().toString().substring(strAbsPathSrc.length())); if(dstFile.exists()) return FileVisitResult.CONTINUE; if(!dstFile.getParentFile().exists()) dstFile.getParentFile().mkdirs(); //System.out.println(file + " " + dstFile.getAbsolutePath()); Files.copy(file, dstFile.toPath()); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { //e.printStackTrace(); return; } return; }

Su código usa la función java8 Files.walkFileTree.