IO流读取文件夹注意事项:
今天在这个IO流读取多级文件夹中卡了很久,一直找不到错误。 最初是找到文件夹但拒绝访问 原代码如下
/* * 复制多级文件夹 * * 数据源:F:\1-Java * 目的地:F:\copy */ public class CopyFolderDemo3 { public static void main(String[] args) throws IOException { // 封装数据源目录 File srcFolder = new File("F:\1-Java"); System.out.println("OK?"); // 封装目的地目录 File destFolder = new File("F:"); if (!destFolder.exists()) { destFolder.mkdir(); } // 递归遍历 digui(srcFolder, destFolder); } public static void digui(File srcFolder, File destFolder) throws IOException { // 生成文件/文件夹数组 File[] fileArray = srcFolder.listFiles(); //遍历数组 for(File f:fileArray){ // 如果是文件夹 if (srcFolder.isDirectory()) { // 创建文件夹 File newFolder = new File(destFolder, srcFolder.getName()); newFolder.mkdir(); digui(f, newFolder); } else { // 创建字节输入流对象 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFolder)); // 创建字节输出流对象 BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File(destFolder, srcFolder.getName()))); int len; byte[] bys = new byte[1024]; while ((len = bis.read(bys)) != -1) { bos.write(bys, 0, len); bos.flush(); } bos.close(); bis.close(); } } }
后来找了很久,发现问题关键在于
File[] fileArray = srcFolder.listFiles(); //遍历数组 for(File f:fileArray){ // 如果是文件夹 if (srcFolder.isDirectory()) { // 创建文件夹 File newFolder = new File(destFolder, srcFolder.getName()); newFolder.mkdir(); digui(f, newFolder); }
这段代码问题在于,如果第一个File遍历得到的是一个文件夹,那么递归下去的srcFolder将为一个文件夹。
// 创建字节输入流对象 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFolder)); // 创建字节输出流对象 BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File(destFolder, srcFolder.getName())));
导致这段代码使用的将是一个文件夹而并非一个文件,因此无法正常的进行IO流数据传输。
后将代码改成
// 如果是文件夹 if (srcFolder.isDirectory()) { // 创建文件夹 File newFolder = new File(destFolder, srcFolder.getName()); newFolder.mkdir(); // 生成文件/文件夹数组 File[] fileArray = srcFolder.listFiles(); for(File f:fileArray){ digui(f, newFolder); } }
此时成功完成多级文件夹的复制
不知道解释是否正确,请各位大牛指点。