【文件操作与IO】详细解析文件操作与IO (一)

发布于:2025-04-19 ⋅ 阅读:(27) ⋅ 点赞:(0)

在这里插入图片描述

本篇博客给大家带来的是文件操作的知识点.
🐎文章专栏: JavaEE初阶
🚀若有问题 评论区见
欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .

要开心

要快乐

顺便进步

一. 什么是文件

1. 认识文件
先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,
往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。

在这里插入图片描述

2. 树型结构组织和目录
随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织,也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概念。
在这里插入图片描述
D盘下有目录11,目录11下又有图片,图片下还有…

3. 文件路径(Path)
在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。

在这里插入图片描述

除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在结点的一条路径。
在这里插入图片描述
相对路径需要先指定一个目录,作为基准目录,从基准目录出发,找到指定文件. 如果是命令行操作,基准目录,就是当前所处目录. 如果是图形化界面,基准目录就不好确定,对于IDEA来说,基准目录就是项目目录.
在这里插入图片描述

4. 其他知识
即使是普通文件,根据其保存数据的不同,也经常被分为不同的类型,我们一般简单的划分为文本文件和二进制文件,分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。

Windows 操作系统上,会按照文件名中的后缀来确定文件类型以及该类型文件的默认打开程序。但这个习俗并不是通用的,在 OSX、Unix、Linux 等操作系统上,就没有这样的习惯,一般不对文件类型做如此精确地分类。
在这里插入图片描述
文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地可以认为有可读、可写、可执行权限。

Windows 操作系统上,还有一类文件比较特殊,就是平时我们看到的快捷方式(shortcut),这种文件只是对真实文件的⼀种引用而已。其他操作系统上也有类似的概念,例如,软链接(soft link)等.

最后,很多操作系统为了实现接口的统一性,将所有的 I/O 设备都抽象成了文件的概念,使用这一理念最为知名的就是 Unix、Linux 操作系统, 万物皆文件。

5. 很多文件都是二进制的,比如:.docx,pptx…等. 那如何判断一个文件是二进制文件还是文本文件
可以用记事本打开我们要判断的文件,如果打开之后乱码了,那就说明这个文件是二进制文件.否则就是文本文件.


二. Java操作文件

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件。

File类

Ⅰ常见属性
在这里插入图片描述
pathSeparator(\)是一个路径中,用来分割目录的符号.
如果当前系统是Windows,那么正斜杠(/)和反斜杠(\)都可以.一般首选用正斜杠(/).
如果是Linux或者Mac,那就用(\).

Ⅱ 构造方法
在这里插入图片描述
一个File对象就表示了一个硬盘文件,在构造对象的时候,就需要吧这个文件的路径给指定进来.(绝对/相对路径都是可以的). 文件名要包括后缀.

Ⅲ 方法
在这里插入图片描述
在这里插入图片描述

代码示例一: 获取目录

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("d:/test.txt");//如果要使用反斜杠\就得使用两个\\ 只使用一个\会出现语法错误
        System.out.println(file1.getParent());//获取父目录的文件路径.
        System.out.println(file1.getName());//获取文件名
        System.out.println(file1.getPath());//获取相对路径
        System.out.println(file1.getAbsoluteFile());//获取绝对路径
        System.out.println(file1.getCanonicalFile());//获取修饰过的绝对路径.

        System.out.println();
        File file2 = new File("./test.txt");//如果要使用反斜杠\就得使用两个\\ 只使用一个\会出现语法错误
        System.out.println(file2.getParent());//获取父目录的文件路径.
        System.out.println(file2.getName());//获取文件名
        System.out.println(file2.getPath());//获取相对路径
        System.out.println(file2.getAbsoluteFile());//将当前相对路径拼接到基准目录(项目目录)上.就得到了绝对路径.
        System.out.println(file2.getCanonicalFile());//获取修饰过的绝对路径.


    }
}

注意构造file对象时,如果使用反斜杠(\),要使用两个\\.

代码示例二: 创建新的文件并判断文件类型

public class Demo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("d:/test.txt");
        System.out.println(file.exists());//判断文件是否存在
        System.out.println(file.isDirectory());//判断文件是否是一个目录
        System.out.println(file.isFile());//判断是否是普通文件

        boolean check = file.createNewFile();
        System.out.println("check = "+check);
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }
}

代码示例三: 删除文件

public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        File file = new File("d:/test.txt");
        //file.delete();//立刻删除.
        file.deleteOnExit();//进程结束后删除.
        Thread.sleep(5000);
        System.out.println("进程结束");
    }
}

deleteOnExit()方法表示进程结束后再删除文件. 就好像在WPS中编辑一个文件的时候,就会自动产生一个隐藏文件,当关闭文件的时候隐藏文件自动删除.通过这样的隐藏文件,就可以告诉 WPS,上一次关闭是正常关闭,还是异常关闭,如果电脑突然关机,就可以恢复出之前正在编辑的内容.

代码示例四: 遍历目录下的文件名

public class Demo4 {
    public static void main(String[] args) {
        File f = new File("d:/");
        String[] file = f.list();
        System.out.println(Arrays.toString(file));
    }
}

在这里插入图片描述
如果我直接打印file,会出现上述@…,那么问题来了,这串东西是不是地址?

注意,这串东西不是地址,而是通过调用hashCode方法返回的哈希值.
Java代码中是没有任何方法能获取到"内存地址"的,要想拿到地址,只能靠native方法进入JVM内部,通过C++ 代码获取到.

代码示例5: 创建目录

public class Demo5 {
    public static void main(String[] args) {
//        File f = new File("d:/java109");
//        boolean ret = f.mkdir();//创建一个目录
//        System.out.println("ret = " + ret);//true

//        File f = new File("d:/java109/aaa/bbb/ccc");
//        boolean ret = f.mkdir();//创建一个目录
//        System.out.println("ret = " + ret);//false
        //创建多级目录得用mkdirs()方法
        File f = new File("d:/java109/aaa/bbb/ccc");
        boolean ret = f.mkdirs();//创建一个目录
        System.out.println("ret = " + ret);
    }
}

代码示例6: 文件重命名

public class Demo6 {
    public static void main(String[] args) {
        File srcFile = new File("d:/test.txt");
        File destFile = new File("d:/test2.txt");
        boolean ret = srcFile.renameTo(destFile);
        System.out.println("ret = "+ret);
    }
}





本篇博客到这里就结束啦, 感谢观看 ❤❤❤

🐎期待与你的下一次相遇😊😊😊


网站公告

今日签到

点亮在社区的每一天
去签到