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

JAVA——对任何类型文件进行文件复制

程序员文章站 2024-03-04 20:44:00
...

对任何类型文件进行文件复制


####1.要求
通过二进制流的操作方式把程序调整为可以实现对任何类型文件进行文件复制。

####2.方法

  • FileInputStream类是文件输入流,根据文件路径可以构造一个FileInputStream对象。
  • FileInputStream的read实例方法从文件输入流中读取数据,即读取文件内容。
  • FileOutputStream类是文件输出流,根据文件路径可以构造一个FileOutputStream对象。
  • FileOutputStream的write实例方法将数据写入到输入流中,即往文件中写内容。
  • 读写文件结束后,需要关闭文件输入、输出流。

####3.实现过程

  • copyFileFromDir()方法复制目录下的文件到指定的目录,会连同子目录一起复制过去,其中不包括该目录。根据指定目录创建文件对象,调用createFile()方法创建文件对象,由于传递的第二个参数为false则是创建目录,如果参数为true,则是创建文件。根据目标路径创建文件对象。如果创建的都是目录,则调用copyFileToDir()方法将指定目录中的文件复制到目标目录中。
  • copyFileToDir()方法复制一组文件到指定目录。判断指定目录是否为空,若为空则返回。根据目标路径创建文件对象,如果该文件对象不存在,则新建该目录对象,否则判断文件对象是否是目录,如果不是目录则返回。运用循环遍历需要复制的文件路径,根据路径创建相应的文件对象,如果该文件对象是目录,则调用 copyFileDir()方法通过listFile()方法获得目录中的文件并将文件复制到指定目录中,如果是文件则直接将文件复制到目录中。
  • copyFile()方法是复制文件到指定的目录中,File类的exists()方法判断指定文件是否存在,如果存在则返回,否则调用createFile()方法创建文件。根据传入的目标文件创建输入流,再根据流对象创建文件输出流,创建字节数组用来储存读取的数据。根据读取的数据不为空进行循环,利用文件输出流的write()方法将目标文件的内容写入到指定文件中,读取完毕后释放相关的流资源。
    listFile()方法获得指定目录下的文件,并将文件的绝对路径放入字符串数组中返回。文件对象的list()方法获得目录中的文件,运用循环将目录中的文件的绝对路径放在字符串数组中返回。
  • createFile()方法判断文件是否存在,如果不存在则判断该文件的上级目录是否存在,如果不存在则调用createFile()方法创建该目录,否则判断上级目录是否是文件,如果是文件则创建新文件,否则创建目录。

####4.代码

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class rw14 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String frompath = "D:\\office\\学前任务\\工程训练\\工程训练代码\\目录路径"; //目录路径
		String topath ="D:\\office\\学前任务\\工程训练\\工程训练代码\\源路径"; //源路径
		System.out.println("复制目录"+topath+"下的文件(不包含该目录)到指定目录"+frompath+",会连同子目录一起复制过去");
		copyFileFromDir(frompath,topath); //调用方法实现目录复制
	}
	//复制目录下的文件(不包括该目录)到指定目录,会连同子目录一起复制过去
	public static void copyFileFromDir(String topath, String frompath) {
		// TODO Auto-generated method stub
		File file = new File(frompath);//
		createFile(topath,false);//true表示创建文件,false表示创建目录
		if(file.isDirectory()) { //如果是目录
			copyFileToDir(topath,listFile(file));
		}
	}

	public static String[] listFile(File dir) {//获取文件绝对路径
		// TODO Auto-generated method stub
		String absolutPath=dir.getAbsolutePath();//获得文件目录的绝对路径
		String[] paths=dir.list();//文件名数组
		String[] files = new String[paths.length];//声明字符串数组,长为传入文件的个数
		for(int i=0;i<paths.length;i++) {//遍历显示文件绝对路径
			files[i]=absolutPath+"/"+paths[i];
		}
		return files;
	}
	public static void createFile(String path,boolean isFile) {//创建文件或目录
		createFile(new File(path),isFile); //调用的方法创建新文件或目录
	}
	public static void createFile(File file, boolean isFile) { //创建文件或目录
		// TODO Auto-generated method stub
		if(!file.exists()) {  //如果文件不存在
			if(!file.getParentFile().exists()) { //如果文件父目录不存在
				createFile(file.getParentFile(),false);
			}else {  //存在文件父目录
				if(isFile) { //创建文件
					try {
						file.createNewFile(); //创建新文件
						}catch(IOException e) {
							e.printStackTrace();
						}
				}else {
					file.mkdir();  //创建目录
				}
			}
		}
	}
	//复制一组文件到指定目录。targeDir是目标目录,filePath是需要复制的文件路径
	public static void copyFileToDir(String toDir,String[] filePath) {
		if(toDir ==null||"".equals(toDir)) {//目标路径为空
			System.out.println("参数错误,目标路径不能为空");
			return;
		}
		File targetFile = new File(toDir);
		if(!targetFile.exists()) { //如果指定目录不存在
			targetFile.mkdir();//新建目录
		}else {
			if(!targetFile.isDirectory()) {//如果不是目录
				System.out.println("参数错误,目标路径指向的不是一个目录!");
				return;
			}
		}
		for(int i=0;i<filePath.length;i++) {//遍历需要复制的文件路径
			File file=new File(filePath[i]);//创建文件
			if(file.isDirectory()) {//判断是否是目录
				//递归调用方法获得目录下的文件
				copyFileToDir(toDir+"/"+file.getName(),listFile(file));
				System.out.println("复制文件"+file);
			}else {
				copyFileToDir(toDir,file,"");//文件到指定目录
			}
		}
	}
	//复制文件到指定目录
	public static void copyFileToDir(String toDir, File file, String newName) {
		// TODO Auto-generated method stub
		String newFile="";
		if(newName!=null&&!"".equals(newName)) {
			newFile=toDir+"/"+newName;
		}else {
			newFile=toDir+"/"+file.getName();
		}
		File tFile=new File(newFile);
		copyFile(tFile,file);//调用方法复制文件
	}
	public static void copyFile(File toFile, File fromFile) {//复制文件
		// TODO Auto-generated method stub
		if(toFile.exists()) {//判断目标目录中文件是否存在
			System.out.println("文件"+toFile.getAbsolutePath()+"已经存在,跳过该文件!");
			return;
		}else {
			createFile(toFile,true);//创建文件
		}
		System.out.println("复制文件"+fromFile.getAbsolutePath()+"到"+toFile.getAbsolutePath());
		try {//创建文件输入流
			InputStream is=new FileInputStream(fromFile);
			FileOutputStream fos =new FileOutputStream(toFile);//文件输出流
			byte[]buffer=new byte[1024];//字节数组
			while(is.read(buffer)!=-1) {//将文件内容写到文件中
				fos.write(buffer);
			}
			is.close();  //输入流关闭
			fos.close();//输出流关闭
		}catch(FileNotFoundException e) {//捕获文件不存在异常
			e.printStackTrace();
		}catch(IOException e) { //捕获异常
			e.printStackTrace();
		}
	}
	

}

####5.结果
编译结果如下图所示:
JAVA——对任何类型文件进行文件复制
运行结果如下图所示:
JAVA——对任何类型文件进行文件复制