文件及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();
        }
    }
}
相关推荐
爱编程的鱼10 分钟前
OpenCV Python 绑定:原理与实战
c语言·开发语言·c++·python
这周也會开心17 分钟前
云服务器安装JDK、Tomcat、MySQL
java·服务器·tomcat
hrrrrb1 小时前
【Spring Security】Spring Security 概念
java·数据库·spring
小信丶1 小时前
Spring 中解决 “Could not autowire. There is more than one bean of type“ 错误
java·spring
sdgsdgdsgc1 小时前
Next.js企业级应用开发:SSR、ISR与性能监控方案
开发语言·前端·javascript
周杰伦_Jay2 小时前
【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
java·jvm
rit84324995 小时前
基于MATLAB的模糊图像复原
开发语言·matlab
fie88895 小时前
基于MATLAB的声呐图像特征提取与显示
开发语言·人工智能
程序员小凯6 小时前
Spring Boot测试框架详解
java·spring boot·后端
豐儀麟阁贵6 小时前
基本数据类型
java·算法