IO(输入/输出)是比较抽象的,看不到明显的运行效果,但输入和输出是所有程序都必需的部分。Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在 Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入输出源。输入流是读取数据,比如说读取某个文件的数据;输出流是写入数据,比如说把数据写入到某个文件中。而使用IO流复制文件夹或文件的本质就是利用IO流的输入输出来读取和写入文件从而实现复制。
首先写个复制文件的方法,传入两个参数,File类型的起始路径和目标路径。
public static void copy(File startFile, File endFile) throws IOException,FileNotFoundException {
//判断文件或目录是否存在,不存在则不执行
if(startFile.exists() && endFile.exists()){
//判断目标路径是否是一个目录,如果不是目录则不执行复制,只能复制到某个目录下面,不能复制到某个文件中
if(endFile.isDirectory()){
//判断起始路径是否是一个目录,如果是目录则复制目录,如果不是目录则复制文件
if(startFile.isDirectory()){ /*这个代码块复制目录*/
//要复制的endFile的路径拼接上startFile的目录名作为新的目标目录路径
File fileName = new File(endFile,startFile.getName().toString());
//创建此目录
fileName.mkdir();
//获取子目录和子文件
File[] files = startFile.listFiles();
//循环遍历每一个子目录和子文件
for (File file : files) {
//调用递归,进行复制
copy(file,fileName);
}
}else{ /*这个代码块复制文件*/
//创建输入流
InputStream inputStream = new FileInputStream(startFile);
//创建一个新的空文件
File fileName = new File(endFile,startFile.getName().toString());
fileName.createNewFile();
//创建输出流
OutputStream outputStream = new FileOutputStream(fileName);
//读取文件内容
byte[] bs = new byte[1024];
int count = 0;
while ((count = inputStream.read(bs, 0, bs.length)) != -1) {
//将读取到的内容输出到新文件
outputStream.write(bs, 0, count);
}
inputStream.close();//关闭输入流
outputStream.flush();//将输出流中所有数据推进到文件中
outputStream.close();//关闭输出流
}
}else{
System.out.println("只能复制到目录下,不能复制到文件下");
}
}else{
System.out.println("文件或目录不存在");
}
}
最后在主方法中调用这个复制文件的方法,传递File类型的起始路径和目标路径作为参数。
public static void main(String[] args) {
File startFile = new File("G:/z/zz");
File endFile = new File("G:/z/z");
try {
copy(startFile, endFile);
} catch (Exception e) {
e.printStackTrace();
}
}
执行完结果如下: