Java:IO/NIO篇,利用NIO遍历目录示范(示范:有选择地从光盘拷贝文件)
1. 问题
买了本《Android开发实战经典》书,附带光盘中有很多视频等内容,居然有两张DVD那么大,我想把光盘中的源代码部分拷贝到硬盘中,这样查看方便,但忽略某些文件(如:视频,过大的文件等)。
2. 解决
写了如下程序,功能就是将光盘目录完整拷贝到硬盘指定目录,但忽略某些文件(如:视频,过大的文件等)。
package com.clzhang.sample.nio; import java.io.*; import java.nio.file.*; import java.nio.file.attribute.*; /** * 将整个光盘的内容拷贝到硬盘指定目录中,忽略某些文件(视频、可执行文件等) * * @author acer * */ public class CopyFilesFromCD { private String srcDrive = "E:"; private String destDirRoot = "D:\\MyDocuments\\Study\\android\\"; public void process() throws Exception { // 遍历CD目录下的所有文件和子目录 Files.walkFileTree(Paths.get(srcDrive), new SimpleFileVisitor<Path>() { // 访问文件时候触发该方法 @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { String srcFile = file.toString().substring(2); // 忽略可执行文件、视频及特定的文件 if (srcFile.endsWith(".exe") || srcFile.endsWith(".wmv") || srcFile.contains("[讲师 MLDN李兴华]")) { System.out.println("忽略:" + file); } else { // 拷贝 System.out.println("正在拷贝:" + file); String destFile = destDirRoot + srcFile; // 是否需要程序手工关闭输出流? FileOutputStream fout = new FileOutputStream(destFile); Files.copy(file, fout); fout.close(); //Files.copy(file, new FileOutputStream(destFile)); } return FileVisitResult.CONTINUE; } // 开始访问目录时触发该方法 @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { // 创建目标路径,存在与否不管 String srcDir = dir.toString().substring(2); String destDir = destDirRoot + srcDir; File file = new File(destDir); if (!file.exists()) { file.mkdirs(); } return FileVisitResult.CONTINUE; } }); System.out.println("拷贝结束!"); } /** * @param args */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub CopyFilesFromCD ins = new CopyFilesFromCD(); ins.process(); } }