Java中IO(五、java.io.File类)

文件和目录路径名的抽象表示



一、File类


/*
* java.io.File类:文件和文件路径的抽象表示形式,与平台无关
*   在操作系统层面,一切皆文件。文件是操作系统保存数据和逻辑的唯一形式
*   File能新建、删除、重命名文件和目录,但是不能访问文件内容本身
*       如果需要访问文件内容本身,需要使用输入/输出流
*   File 类不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性
*   在java程序中表示一个真实存在的文件或目录,则必须有一个File对象
*   File对象可作为参数传递给流的构造器
*
* File类的构造方法
*   public File(String pathname): 以pathname为路径创建File对象,可以是绝对路径或相对路径
*   public File(String parent, String child): 以parent为父路径,child为子路径创建
*   public File(File parent, String child): 根据一个父File对象和子文件路径成File对象
*
* 常用方法
*   获取功能:
*       public String getAbsolutePath(): 获取绝对路径
*       public String getPath(): 回去路径
*       public String getName(): 获取名称
*       public String getParent(): 获取上层文件目录,若无,返回null
*       public Long length(): 获取文件长度(即字节数)。不能获取目录长度
*       public Long lastModified(): 获取最后一次修改时间,毫秒值
*       public String[] list(): 获取指定目录下所有文件或者文件目录的名称数组
*       public File[] listFiles(): 获取指定目录下所有文件或者文件目录的File数组
*   重命名功能:
*       public boolean renameTo(File dest): 重命名为指定文件路径
*   判断功能:
*       public boolean isDirectory(): 判断是否是文件目录
*       public boolean isFile(): 判断是否是文件
*       public boolean exists(): 判断是否存在
*       public boolean canRead(): 判断是否可写
*       public boolean canWrite(): 判断是否可读
*       public boolean isHidden(): 判断是否隐藏
*   创建删除功能:
*       public boolean createNewFile(): 创建文件,若文件存在,则不创建,返回false
*       public boolean mkdir(): 创建文件目录,若存在,不创建。若文件目录上层目录不存在,也不创建
*       public boolean mkdirs(): 创建文件目录,若文件目录上层目录不存在,一并创建
*           如果创建文件或目录没有写盘符名称,则默认在项目路径下
*       public boolean delete(): 删除文件或文件夹
*           java中删除不走回车站
 * */

public class _01_File {

    public static void main(String[] args) throws IOException {
        // 创建文件对象,可以是文件也可以是目录
        File file = new File("D:/迅雷下载/JavaWeb_tianliang");
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getName());
        System.out.println(file.getParent());
        System.out.println(file.isFile()); // false
        System.out.println(file.isDirectory()); // true

        // 获取子文件
        File[] files = file.listFiles();
        for (File file1 : files) {
            // 打印绝对路径
            System.out.println(file1.getAbsoluteFile());
        }
        System.out.println(file.exists()); // true

        // 创建一个不存在目录
        File file1 = new File("D:/com/ZPR");
        System.out.println(file1.exists()); // false

        // 创建一个不存在目录
        // 只创建ZPR目录,不会创建com目录
        // file1.mkdir();
        
        // 递归创建所有目录(com和ZPR)
        // file1.mkdirs();
        System.out.println("-----------------------------");

        // 创建文件
        File file2 = new File("D:/JavaTest/IO.java");
        // 如果有对应文件就不创建,返回false。否则返回true
        System.out.println(file2.createNewFile());

        // 删除文件,删除成功返回true
        System.out.println(file2.delete());

        File file3 = new File("D:/JavaTest/111.txt");
        System.out.println(file3.canRead());
    }
}

二、使用File类实现文件递归复制


/*
* 递归赋值一个文件夹
*   使用标准化开发流程(高内聚、低耦合)
*   1 文件复制:本质是输入和输出
*       a 完成文件输入
*       b 完成文件输出
*       c 整合输入输出,完成文件复制
*   代码test1~2,FileUtil,FileException
*   2 获取目录下所有子目录
*       a 获取目录对象
*       b 获取目录下直接子目录
*       c 获取目录下所有后代目录
*   代码test3~4,FileCopyManager
*   3 整合所有后代目录,和文件复制
*       a 获取所有后代目录后,得到每一个后代文件对象
*       b 通过文件对象可以获得文件的全路径
*       c 通过全路径可创建输入流
*       d 然后创建输出流输出
*   代码FileCopyManager,CopyDirectory
*
* 复制时输入流和输出流的路径不能相同,否则导致以下两种情况
*   1 文件清空 boolean false
*   2 死循环写数据 boolean true
* 创建输出流对象的时候,构造方法第二个参数可传递Boolean值
*   true:向该文件中追加写入新数据
*   false:覆盖该文件,重新写入
*   1 false情况:
*       如果没有传递Boolean值,默认是覆盖写入
*       在创建对象时,会把文件清空。导致使用输入流入读的时候读不到,返回-1
*   2 true情况:2
*       追加写入,成功输出流对象时不会情况文件,在读数据时返回-1时候才写入,但是每次写入之后,循环再读,
*       这时候不是返回-1,因为写入了数据。并且是读了多少就追加多少,会造成不断读写,进入死循环。
* */

util工具类

/**
 * 核心业务类
 *  按文件目录递归复制类
 */
public class FileCopyManager {

    /**
     * 递归复制(方法重载)
     *      对外提供的接口
     * @param srcPath 被复制文件路径
     * @param destPath 目标路径
     */
    public static void checkMenu(String srcPath, String destPath){
        File file = new File(srcPath); // 重载新加的功能
        checkMenu(file,destPath);
    }

    /**
     * 递归复制
     *     a 获取所有后代目录后,得到每一个后代文件对象
     *     b 通过文件对象可以获得文件的全路径
     *     c 通过全路径可创建输入流
     *     d 然后创建输出流输出
     * @param file 被复制的文件对象
     * @param destPath 目标路径
     */
    private static void checkMenu(File file, String destPath){
        // 判断是否是文件
        if (file.isFile()){
            // 文件全路径(源文件)
            String filePath = file.getAbsolutePath();
            // 截取路径并拼接字符串,把源文件内容复制到目录路径
            // 源文件:D:\迅雷下载\JavaWeb_tianliang\01_JavaWeb介绍\1-1 JavaWeb介绍-1365902892321472512.mp4
            // 目录:D:\JavaTest\JavaWeb_tianliang\01_JavaWeb介绍\1-1 JavaWeb介绍-1365902892321472512.mp4
            // "D:\迅雷下载" 被 "D:\JavaTest"代替。"D:\迅雷下载"占用7个字符,则重第七个开始截取源文件路径
            // 使能够做到完全复制,"D:\JavaTest"使用参数传入,外部控制
            String newFilePath = destPath+filePath.substring(7);
            // 判断目标目录是否存在,输出流只会创建文件,不会创建目录
            // newFilePath是文件对象,这里判断该文件所在目录是否存在,不存在就创建目录
            // 获取上级目录
            File parentFile = new File(newFilePath).getParentFile();
            if (!parentFile.exists()){
                parentFile.mkdirs();
            }
            // 到这里,目标目录创建成功,开始复制
            FileUtil.copyFile(filePath,newFilePath);
            return;
        }
        // 到这说明是目录
        // 获取所有子文件
        File[] files = file.listFiles();
        for (File file1 : files) {
            // 不断递归判断是否是文件,是文件打印文件绝对路径,否则递归继续判断子目录
            checkMenu(file1,destPath);
        }
    }
}

/*
* 文件操作异常类
* */
public class FileException extends RuntimeException{

    private static final long serialVersionUID = 1L;

    public FileException() {
    }

    public FileException(String message) {
        super(message);
    }
}

**
 * 复制文件工具类
 */
public class FileUtil {
    /**
     * 复制文件,使用字节复制,存文本另外使用
     * @param srcPath 原文件路径
     * @param destPath 目标文件路径
     */
    public static void copyFile(String srcPath, String destPath) throws FileException {
        // 两个路径去除两边空格相等,直接返回
        if (srcPath.trim().equals(destPath.trim())) {
            throw new FileException("原文件路径和目标文件路径不能相同");
        }
        try (
                FileInputStream fis = new FileInputStream(srcPath);
                BufferedInputStream bis = new BufferedInputStream(fis);
                FileOutputStream fos = new FileOutputStream(destPath);
                BufferedOutputStream bos = new BufferedOutputStream(fos)
        ){
            byte[] bytes = new byte[1024];
            int temp;
            while ((temp=bis.read(bytes))!=-1){
                bos.write(bytes,0,temp);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

测试util类

// 复制文件测试
public class _01_test_copyFile {

    public static void main(String[] args) {
        try (
                FileInputStream fis = new FileInputStream("D:/test.txt");
                BufferedInputStream bis = new BufferedInputStream(fis);
                FileOutputStream fos = new FileOutputStream("D:/test1.txt");
                BufferedOutputStream bos = new BufferedOutputStream(fos)
                ){
            byte[] bytes = new byte[1024];
            int temp;
            while ((temp=bis.read(bytes))!=-1){
                bos.write(bytes,0,temp);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

public class _02_test_FileUtil {

    public static void main(String[] args) {
        FileUtil.copyFile("D:/test.txt","D:/test1.txt");
    }
}

// 获取目录下直接子目录
public class _03_test_Subfile {

    public static void main(String[] args) {
        // 创建文件对象
        File file = new File("D:/迅雷下载/JavaWeb_tianliang");

        if (file.isFile()){
            System.out.println(file.getName());
            return;
        }
        // 到这说明是目录
        // 获取所有子文件
        File[] files = file.listFiles();
        for (File file1 : files) {
            System.out.println(file1.getName());
        }
    }

}

// 获取目录下所有后代目录
public class _04_test_Subfiles {

    public static void main(String[] args) {
        // 创建文件对象
        File file = new File("D:/迅雷下载/JavaWeb_tianliang");
        test(file);

    }

    public static void test(File file){
        // 判断是否是文件
        if (file.isFile()){
            // 是打印路径
            System.out.println(file.getAbsolutePath());
            return;
        }
        // 到这说明是目录
        // 获取所有子文件
        File[] files = file.listFiles();
        for (File file1 : files) {
            // 不断递归判断是否是文件,是文件打印文件绝对路径,否则递归继续判断子目录
            test(file1);
        }
    }
}

用户类

public class CopyDirectory {

    public static void main(String[] args) {

        String srcPath = "D:/迅雷下载/JavaWeb_tianliang";
        String destPath = "D:/JavaTest";
        // 对外仅通过提供源文件路径和目标路径即可完成复制
        // 高内聚低耦合
        FileCopyManager.checkMenu(srcPath,destPath);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值