I/O流完成文件夹复制

导读:本篇文章讲解 I/O流完成文件夹复制,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

I/O流简述

A:IO流概述

IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中 java.io

B:IO流分类

a:按照数据流向 站在内存角度
	输入流	读入数据
	输出流	写出数据
b:按照数据类型
	字节流 可以读写任何类型的文件 比如音频 视频  文本文件
	字符流 只能读写文本文件
	什么情况下使用哪种流呢?
	如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。
	如果你什么都不知道,就用字节流

输入流读文件,输出流写文件

我们试想生活中的文件复制步骤为Ctrl+C,Ctrl+V,通过这两个步解决问题,IO流完成复制的话也是两个步骤,首先用输入流来完成Ctrl+C,再用输出流完成Ctrl+V。输入流(源文件)每次读取一些信息,输出流在自己的文件里写入这些信息,输入流再读信息,输出流继续把读出的信息写进去,直到输出流读完信息,输入流就完成了信息写入,最终显示的就是文件复制

		File src = new File("G:\\测试图片");//源文件位置
        File target = new File("D:\\" + src.getName());//目标文件位置
        File[] files = target.listFiles();
        FileInputStream in = new FileInputStream(f);
        File file = new File(target, f.getName());
        FileOutputStream out = new FileOutputStream(file);
        int len=0;
        byte[] bytes = new byte[1024 * 8];
        while((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();

递归实现文件夹复制

因为IO流并不能把文件夹复制出来,只能复制文件夹里的文件,所以我们遇到文件夹的时候先遍历文件夹,把文件给复制出来,当文件夹里含有文件夹的时候,我们再去遍历这个子文件夹,再次遍历文件夹就是在完成递归操作。

File[] files = src.listFiles();
        for (File f : files) {
            if(f.isFile()){
                copy(f,target);
            }else{
                //创建文件夹
                String name = f.getName();
                target=new File(target,name);
                fileCopy(f,target);
            }
        }

当然,我们在递归遍历文件夹的时候,需要创建该子文件夹,把子文件夹封装起来,传递给fileCopy(),通过该方法实现子文件夹创建

private static void fileCopy(File src, File target) throws IOException {
        //target = new File(src.getName());

        if(!target.exists()){
            target.mkdirs();
            copyFile(src,target);
        }else{
            copyFile(src,target);
        }
    }

源代码

public class MyTest {
    public static void main(String[] args) throws IOException {
        File src = new File("G:\\测试图片");
        File target = new File("D:\\" + src.getName());
        fileCopy(src, target);
        fileChangename(target);

    }

    private static void fileChangename(File target) {
        File[] files = target.listFiles();
        for (File f : files) {
            if(f.isFile()){
                if(f.getName().endsWith(".jpg")){
                    String fParent = f.getParent();
                    String s = f.getName().replace(".jpg", ".png");
                    File f2=new File(fParent,s);
                    boolean b = f.renameTo(f2);
                    System.out.println(b);
                }
            }else{
                fileChangename(f);
            }
        }
    }

    private static void fileCopy(File src, File target) throws IOException {
        //target = new File(src.getName());

        if(!target.exists()){
            target.mkdirs();
            copyFile(src,target);
        }else{
            copyFile(src,target);
        }
    }

    private static void copyFile(File src, File target) throws IOException {
        File[] files = src.listFiles();
        for (File f : files) {
            if(f.isFile()){
                copy(f,target);
            }else{
                //创建文件夹
                String name = f.getName();
                target=new File(target,name);
                fileCopy(f,target);
            }
        }
    }

    private static void copy(File f, File target) throws IOException {
        FileInputStream in = new FileInputStream(f);
        File file = new File(target, f.getName());
        FileOutputStream out = new FileOutputStream(file);
        int len=0;
        byte[] bytes = new byte[1024 * 8];
        while((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/14644.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!