欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

IO复制多级目录 控制台输入文件目录然后把目录下java文件复制到 D: 并统计java个数

程序员文章站 2022-06-26 13:21:05
从控制台获取输入的文件目录然后将该目录(包含子目录)下的.java文件复制到D:/java文件夹中,并统计java文件的个数. 提示:如果有相同的名称的文件,如果两个Test01.java,则拷贝到目标文件夹时只能有一个Test01.java,另一个Test01.java要修改为另一个名称:该名称可 ......
  1. package cn.itcast_05;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.File;  
  6. import java.io.FileInputStream;  
  7. import java.io.FileOutputStream;  
  8. import java.io.IOException;  
  9.   
  10. /* 
  11.  * 需求:复制多极文件夹 
  12.  *  
  13.  * 数据源:G:\Java\demos 
  14.  * 目的地:G:\\ 
  15.  *  
  16.  * 分析: 
  17.  *      A:封装数据源File 
  18.  *      B:封装目的地File 
  19.  *      C:判断该File是文件还是文件夹 
  20.  *          a:是文件夹 
  21.  *              就在目的地目录下创建该文件夹 
  22.  *              获取该File对象下的所有文件或者文件夹File对象 
  23.  *              遍历得到每一个File对象 
  24.  *              回到C 
  25.  *          b:是文件 
  26.  *              就复制(字节流)     
  27.  */  
  28. public class copyFolderDemo {  
  29.     public static void main(String[] args) throws IOException {  
  30.         // 封装数据源  
  31.         File srcFolder = new File("D:\\a\\demos");  
  32.         // 封装目的地  
  33.         File destFolder = new File("D:\\");  
  34.   
  35.         // 复制文件夹功能  
  36.         copyFolder(srcFolder, destFolder);  
  37.     }  
  38.   
  39.     /** 
  40.      * 复制文件夹方法 
  41.      *  
  42.      * @param srcFolder 
  43.      *            数据源 
  44.      * @param destFolder 
  45.      *            目的地 
  46.      */  
  47.     public static void copyFolder(File srcFolder, File destFolder)  
  48.             throws IOException {  
  49.         // 判断该File是文件还是文件夹  
  50.         if (srcFolder.isDirectory()) {  
  51.             // 文件夹  
  52.             File newFolder = new File(destFolder, srcFolder.getName());  
  53.             newFolder.mkdir();  
  54.   
  55.             // 获取该File对象下的所有文件或者文件夹File对象  
  56.             File[] fileArray = srcFolder.listFiles();  
  57.             // 遍历得到每一个File对象  
  58.             for (File file : fileArray) {  
  59.                 copyFolder(file, newFolder);  
  60.             }  
  61.   
  62.         } else {  
  63.             // 文件  
  64.             File newFile = new File(destFolder, srcFolder.getName());// G:\d.txt  
  65.   
  66.             // 复制文件功能  
  67.             copyFile(srcFolder, newFile);  
  68.         }  
  69.     }  
  70.   
  71.     /** 
  72.      * 复制文件方法 
  73.      *  
  74.      * @param srcFolder 
  75.      *            数据源 
  76.      * @param newFile 
  77.      *            目的地 
  78.      */  
  79.     public static void copyFile(File srcFolder, File newFile)  
  80.             throws IOException {  
  81.         // 封装数据源  
  82.         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(  
  83.                 srcFolder));  
  84.         // 封装目的地  
  85.         BufferedOutputStream bos = new BufferedOutputStream(  
  86.                 new FileOutputStream(newFile));  
  87.   
  88.         // 读写数据  
  89.         byte[] bys = new byte[1024];  
  90.         int len = 0;  
  91.         while ((len = bis.read(bys)) != -1) {  
  92.             bos.write(bys, 0, len);  
  93.             bos.flush();  
  94.         }  
  95.   
  96.         // 释放资源  
  97.         bos.close();  
  98.         bis.close();  
  99.     }  
  100. }  

 

 

 

 

 

从控制台获取输入的文件目录然后将该目录(包含子目录)下的.java文件复制到D:/java文件夹中,并统计java文件的个数.

提示:如果有相同的名称的文件,如果两个Test01.java,则拷贝到目标文件夹时只能有一个Test01.java,另一个Test01.java要修改为另一个名称:该名称可随机生成,只要不重复即可.

 

package cn.itcast.demo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;

public class Test02 {
static int count = 0;

public static void main(String[] args) throws IOException {
// 获得源文件夹
File srcDir = inputFile();
// 创建目标文件夹对象
File destDir = new File("d:/java");
destDir.mkdirs();
// 拷贝Java文件
copyJavaFile(srcDir, destDir);
System.out.println("count = " + count);
}

/*
* 将srcDir文件夹下的所有.Java文件拷贝到destDir文件夹下
*/
public static void copyJavaFile(File srcDir, File destDir)
throws IOException {
// 获得源文件夹下所有的.java文件和子文件夹
File[] files = srcDir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()
|| pathname.getName().endsWith(".java"))
return true;
return false;
}
});
// 遍历文件数组
for (File file : files) {
// 判断file是否是文件夹
if (file.isDirectory()) {
// 递归调用当前方法
copyJavaFile(file, destDir);
} else { // 如果是文件,拷贝到目标文件夹destDir下
// 获得要拷贝的文件名
String fileName = file.getName();
// 在目标文件夹destDir下创建一个同名文件名
File destFile = new File(destDir, fileName);
// 判断目标文件是否存在
while (destFile.exists()) {
// 重命名目标文件名
destFile = new File(destDir, new Random().nextInt(100000)
+ fileName);
}
System.out.println(destFile);
copyFile(file, destFile);
}
}
}

/*
* 字节流缓冲区流读写字节数组
*/
private static void copyFile(File srcFile, File destFile)
throws IOException {
// 计数器加一
count++;
// 创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
srcFile));
// 创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destFile));

int len = 0;
byte[] buffer = new byte[1024];
// 循环读取数据
while ((len = bis.read(buffer)) != -1) {
// 利用输出流往输出目的写数据
bos.write(buffer, 0, len);
}

// 关闭资源
bis.close();
bos.close();
}

/*
* 根据用户输入的路径字符串创建文件对象
*/
private static File inputFile() {
// 创建键盘输入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件夹路径:");
// 接收用户输入的路径
String filePath = sc.nextLine();
// 根据路径字符串创建文件对象
File dir = new File(filePath);
if (!dir.exists())
throw new RuntimeException("你输入的文件路径不存在!!!");
// 判断是否是文件夹
if (!dir.isDirectory()) {
throw new RuntimeException("输入的路径不是文件夹路径!!!");
}
return dir;
}
}