文件及Java中File类详解

目录

一, 文件

1,什么是文件

2,路径

二, 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方法的使用
    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,普通文件的创建以及删除
    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,普通目录文件的创建以及删除
    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

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

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博客

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();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值