File类及文件夹的完整复制

File类

在实现IO流对文件处理的时候,有一个类是一定要学习的,那就是File类

  • File类的父类是Object,所以不能完成文件的读写操作

  • file对象代表文件和目录路径所在的抽象表示形式

  • file对象可以是一个文件,也可以是一个目录

  • File对象hi是一个路径名的抽象表现形式

1.构造方法

File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。

2.File类常用方法

方法名 作用
exists() 测试此抽象路径名表示的文件或目录是否存在。
equals(Object obj) 测试此抽象路径名与给定对象的相等性。
long length() 返回由此抽象路径名表示的文件的长度。
File[ ] listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
mkdir() 创建由此抽象路径名命名的目录。
mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
createNewFile () 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
String getName() 返回由此抽象路径名表示的文件或目录的名称。
String getParent() 返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。
getParentFile() 返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。
String getPath() 将此抽象路径名转换为路径名字符串。

3.代码示例

import java.io.File;
import java.io.IOException;
public class FileTest01 {
    public static void main(String[] args) throws IOException {
        File f1 = new File("D:/JAVATest/files");
        //1.exists判断是否存在
        System.out.println(f1.exists());
        //如果文件不存在,那么以文件的形式创建出来

//         if (!f1.exists()) {
//            f1.createNewFile();
//        }

       //如果文件不存在,以目录的形式创建出来
//        if (!f1.exists()){
//            f1.mkdir();
//        }
        File f2 = new File("D:/JAVATest/a/b/c/d/e");
        //也可以以多重目录的形式创建
//        if (!f2.exists()){
//            f2.mkdirs();
//        }

        File f3=new File("D:/JAVATest/a/b");
         //获取文件的父路径
        String paraentPath=f3.getParent();
        System.out.println(paraentPath);
        //获取绝对路径
        File paraentFile=f3.getParentFile();
        System.out.println("绝对路径"+paraentFile.getAbsolutePath());
        File f4=new File("log");
        System.out.println("绝对路径"+f4.getAbsolutePath());
    }

}

输出:

false
D:\JAVATest\a
绝对路径D:\JAVATest\a
绝对路径D:\AAAbegin\JAVASE\log

以及上述创建的新文件和目录,在执行一次之后也已经创建成功

file文件被创建

explorer_MCVbGpQ9As

a/b/c/d/e目录被创建

explorer_umTgkuzjRM

看下一段代码,也是介绍File类的方法

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileTest02 {
    public static void main(String[] args) {
        File f1 = new File("D:/JAVATest/files");
        //如果文件存在执行删除操作,delete()方法删除文件路径或目录
        if (f1.exists()){
            f1.delete();
        }
        System.out.println(f1.exists());
        File f2 = new File("D:/JAVATest/a/b/c");
        //还有获取文件名称
        System.out.println(f2.getName());
        //判断是否是一个目录
        System.out.println("是一个目录吗?"+f2.isDirectory());
        //判断是否是一个文件
        System.out.println("是一个文件吗?"+f2.isFile());
        //获取文件的最后一次修改时间
        //这里返回的是一个总毫秒数
        long lastTime=f2.lastModified();
        Date date=new Date(lastTime);
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        String str=sdf.format(date);
        System.out.println("最后修改时间"+str);
        //获取文件大小,返回的是字节数
        System.out.println(f2.length());

    }

}

输出:

false
c
是一个目录吗?true
是一个文件吗?false
最后修改时间2022-07-24 10:02:47 139
0

可以利用循环遍历出某个目录下的所有子文件

public class FileTest03 {
    public static void main(String[] args) {
        //File[] listFiles()
//        获取当前目录下的所有子文件
        File f1 = new File("D:/JAVATest");
        File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file);
        }

    }
}

输出:

D:\JAVATest\a
D:\JAVATest\bufferedReader
D:\JAVATest\bufferedtest
D:\JAVATest\copy02
D:\JAVATest\data
D:\JAVATest\file
D:\JAVATest\filewrite
D:\JAVATest\test
D:\JAVATest\testcopy

4.文件复制

需求:将D盘下的文件JAVATest复制到C盘下面

我们可以利用file类以及学到的输入输出流进行文件的复制操作

设计思路:

首先要有目标文件和源文件,然后实现一个复制的方法即可,

获取文件目录之后,判断是文件还是文件夹,要是文件夹的话创建相同名称的文件夹即可,要是文件,调用IO流一边读一边写,将读取到的源文件中的内容,创建对应的目标文件写入目标文件即可

import java.io.*;

public class FileCopyTest01 {
    public static void main(String[] args) {
        //拷贝源
        File srcfile = new File("D:\\JAVATest");
        //拷贝目标
        File destfile = new File("C:\\");
        //调用方法拷贝
        copyDir(srcfile,destfile);
    }

    private static void copyDir(File srcfile, File destfile) {
        //如果srcFile是一个文件的话,递归结束
        if (srcfile.isFile()) {
            FileInputStream inputStream=null;
            FileOutputStream outputStream=null;
            try {
                inputStream = new FileInputStream(srcfile);
                String path=(destfile.getAbsolutePath().endsWith("\\")? destfile.getAbsolutePath() : "\\"+destfile.getAbsolutePath())+srcfile.getAbsolutePath().substring(3);
                outputStream = new FileOutputStream(path);
                //一边读一边写
                byte[] bytes=new byte[1024*1024];
                int readCount=0;
                while ((readCount=inputStream.read(bytes))!=-1){
                    outputStream.write(bytes,0,readCount);
                }
                outputStream.flush();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                //关闭流
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }


            return;
        }
        //首先获取源目录下面的子目录
        File[] files = srcfile.listFiles();
        for (File file : files) {
            if (file.isDirectory()){
                //获取源文件和目标文件的绝对路径
                String srcDir=file.getAbsolutePath();
                //因为是要从D盘复制到C盘,所以要创建的新文件目录是元源文件的目录去掉D盘加上C盘即可,我们采用截取字符串就可以截取到源文件的目录,再进行字符串的拼接,即可得到需要的目录
                String destDir=(destfile.getAbsolutePath().endsWith("\\")? destfile.getAbsolutePath() : "\\"+destfile.getAbsolutePath())+srcDir.substring(3);
                System.out.println(destDir);
                File newfile = new File(destDir);
                if (!newfile.exists())
                        newfile.mkdirs();
            }
            copyDir(file,destfile);

        }

输出:

image-20220724155055310

当然文件复制的方法不止这一种,我们还可以利用缓冲流再对代码进行优化,实现一些功能,比如,我们可以利用Scanner输入路径,自由的选择去复制想要复制的文件,又或者使用缓冲流来读写数据!

posted @ 2022-07-24 16:58  星余明  阅读(529)  评论(0编辑  收藏  举报