文件及Java中File类详解

目录

[一, 文件](#一, 文件)

1,什么是文件

2,路径

[二, File类](#二, File类)

1,File类的构造方法

签名

说明

2,File类的方法

修饰符及返回值类型

方法签名

说明

2.1,get方法的使用

2.2,普通文件的创建以及删除

2.3,普通目录文件的创建以及删除

3,代码示例

示例1

示例2


一, 文件

1,什么是文件

文件一般分为两类:狭义上的文件和广义上的文件;狭义上的文件一般是针对硬盘上持久化存储的数据(比如硬盘上的文件和目录),而广义上的文件泛指计算机中的很多软硬件资源,操作系统中,把很多的硬件设备和软件资源抽象成了文件;本篇博客主要讨论的是狭义上的文件.

2,路径

我们在写Java程序代码时,存储数据主要是靠变量,每定义一个变量都是存储在内存上的,而这里说的文件则是存储在硬盘上的,每个文件在硬盘上都有一个具体的存储位置,称为"路径";路径又分为绝对路径和相对路径.

绝对路径 :以盘符开头的路径

此时 tmp 的目录的绝对路径就是 d:/tmp

相对路径 :以当前目录(也叫做工作目录:每个程序运行时都有一个工作目录)为基准,以 . 或者 .. 开头( . 有时候可以省略),找到指定的路径

此时所在的当前目录是 d:/tmp/aaa 如果以当前目录为工作目录表示 tmp 目录的话就可以表示为 ../

注意:

  • 目录与目录之间的分隔符既可以用 / 也可以用 / 表示,但是大部分情况下推荐使用 / ,因为使用 \ 时容易出现转义字符的问题
  • 使用相对路径表示路径时,当前目录可以表示为 ./ 上级目录可以表示为 ../

二, File类

  1. 在Java中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述,注意,有File对象并不代表真实存在的文件,但是可以对该file对象进行一些属性获取的操作;
  2. java中对于文件的操作可以分为针对文件系统的操作(文件的创建,删除和重命名)和针对文件内容的操作(文件的读和写).

1,File类的构造方法

|-----------------------------------|-----------------------------------------|
| ###### 签名 | ###### 说明 |
| File(File parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
| File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者 相对路径 |
| File(String parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用 路径表示 |

其中第二种最为方便也是最常用的一种构造方法

2,File类的方法

|-------------------------------|---------------------|------------------------------------------|
| ###### 修饰符及返回 值类型 | ###### 方法签名 | ###### 说明 |
| String | getParent() | 返回 File 对象的父目录文件路径 |
| String | getName() | 返回 FIle 对象的纯文件名称 |
| String | getPath() | 返回 File 对象的文件路径 |
| String | getAbsolutePath() | 返回 File 对象的绝对路径 |
| String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
| boolean | exists() | 判断 File 对象描述的文件是否真实存在 |
| boolean | isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
| boolean | isFile() | 判断 File 对象代表的文件是否是一个普通文件 |
| boolean | createNewFile() | 根据 File 对象,自动创建一个空文件。成功创建后返 回 true |
| boolean | delete() | 根据 File 对象,删除该文件。成功删除后返回 true |
| void | deleteOnExit() | 根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行 |
| String[] | list() | 返回 File 对象代表的目录下的所有文件名 |
| File[] | listFiles() | 返回 File 对象代表的目录下的所有文件,以 File 对象表示 |
| boolean | mkdir() | 创建 File 对象代表的目录 |
| boolean | mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目录 |
| boolean | renameTo(File dest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操作 |
| boolean | canRead() | 判断用户是否对文件有可读权限 |
| boolean | canWrite() | 判断用户是否对文件有可写权限 |

2.1,get方法的使用

java 复制代码
    public static void main3(String[] args) throws IOException {
        File file = new File("D:/xmy.txt");//并非真实存在这个文件
        System.out.println(file.getName());
        System.out.println(file.getParent());
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
    }

windows上盘符大小写都可以,其中创建的file对象并非真实存在,但是依然获取相关属性

2.2,普通文件的创建以及删除

java 复制代码
    public static void main(String[] args) throws IOException {
        File file = new File("D:/xmy.txt");
        System.out.println(file.exists());
        file.createNewFile();
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        file.delete();
        System.out.println(file.exists());
    }

2.3,普通目录文件的创建以及删除

java 复制代码
    public static void main7(String[] args) {
        //对于目录进行删除的时候只能删除空目录或者单个文件
        File file = new File("D:/aaaaa");
        System.out.println(file.exists());
        file.mkdir();
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        file.delete();
        System.out.println(file.exists());
    }
  • 目录创建时,如果是单级目录的话可以使用mkdir,如果是多级目录的话则必须使用mkdirs方法
  • 删除目录的话不可以连续删除多级目录,只能删除空目录或者单个文件

3,代码示例

示例1

扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件

java 复制代码
mport java.io.File;
import java.util.Scanner;

public class Demo3 {
    /**
     * 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
     *
     * @param args
     */
    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {

        System.out.println("请输入你要扫描的根目录: ");
        String rootPath = scanner.next();
        File root = new File(rootPath);

        //如果被扫描的根目录是一个文件的话则无法进行搜索
        if (!root.isDirectory()) {
            System.out.println("输入的根目录有误!");
            return;
        }

        System.out.println("请输入你要删除的文件名: ");
        String nameToDelete = scanner.next();

        //针对路径进行递归扫描
        scanDir(root, nameToDelete);
    }

    private static void scanDir(File root, String nameToDelete) {
        System.out.println("[scanDir]: " + root.getAbsolutePath());//查看一下递归的过程 将每一次的路径打印出来

        //1.将该根目录下的所有目录和文件转换成一个文件数组
        File[] files = root.listFiles();
        if (files == null || files.length == 0) {
            //当root目录下没有任何东西 目录为空 此时结束递归
            return;
        }

        //2.对文件数组进行遍历
        for (File f : files) {
            //判断该文件是普通文件还是目录
            if (f.isDirectory()) {
                //文件是目录的话继续进行递归扫描
                scanDir(f, nameToDelete);
            } else {
                //文件是文件的话判断是否是要删除的文件
                if (f.getName().contains(nameToDelete)) {
                    //是需要删除的文件时循环用户是否进行删除
                    System.out.println("是否要删除 " + f.getAbsolutePath() + " 路径下的 " + f.getName() + " 文件?");
                    String choice = scanner.next();
                    if (choice.equals("y") || choice.equals("Y")) {
                        f.delete();
                        System.out.println("删除成功!");
                    } else {
                        System.out.println("取消删除!");
                    }
                }
            }
        }
    }
}

示例2

使用流对象对文件进行拷贝,这里涉及到了流对象,但是主要也是对于文件的相关操作,流对象的博客详解可以参考:文件操作中的IO流------字节流与字符流_蜡笔小心眼子!的博客-CSDN博客

java 复制代码
import java.io.*;
import java.util.Scanner;

/**
 * 使用流对象对文件进行拷贝
 */

public class Demo4 {
    public static void main(String[] args) {
        //输入两个路径 分别表示源路径和目标路径
        //对于源路径需要判断是否存在
        //对于目标路径需要判断是否已经存在
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入需要拷贝的路径: ");
        String srcPath = scanner.next();
        System.out.println("请输入需要被拷贝到的目标路径: ");
        String destPath = scanner.next();

        File srcFile = new File(srcPath);
        if(!srcFile.isFile()) {
            //如果源文件不是一个文件(是个目录或者不存在) 此时就不进行拷贝
            System.out.println("您当前输入的原路径有误!");
            return;
        }

        File destFile = new File(destPath);
        if(destFile.isFile()) {
            //如果已经存在 此时也不能进行拷贝
            System.out.println("您输入的目标路径有误!");
            return;
        }

        //进行拷贝操作
        try(InputStream inputStream = new FileInputStream(srcFile);
            OutputStream outputStream = new FileOutputStream(destFile)) {

            //进行读写文件操作
            while (true) {
                int b = inputStream.read();
                if(b == -1) {
                    break;
                }
                outputStream.write(b);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
相关推荐
希忘auto5 分钟前
详解MySQL安装
java·mysql
娅娅梨8 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
汤米粥14 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
冰淇淋烤布蕾17 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺23 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE39 分钟前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计