0


文件操作IO

认识文件

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

树型结构组织 和 目录

同时,随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概念。

文件路径(Path)

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

C:\Program Files (x86)\Microsoft\Temp\EU5153.tmp

除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在结点的一条路径

.\表示当前目录
. .\表示上级目录

这里的分隔符可以是,也可以是/,但是为了避免\与字符组合i形成转义字符,需要用\来转义一下其中的一个,

其他知识

即使是普通文件,根据其保存数据的不同,也经常被分为不同的类型,我们一般简单的划分为文本文件和二进制文件,分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。Windows 操作系统上,会按照文件名中的后缀来确定文件类型以及该类型文件的默认打开程序。但这个习俗并不是通用的,在 OSX、Unix、Linux 等操作系统上,就没有这样的习惯,一般不对文件类型做如
此精确地分类。
文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地可以认为有可读、可写、可执行权限
Windows 操作系统上,还有一类文件比较特殊,就是平时我们看到的快捷方式(shortcut),这种文件只是对真实文件的一种引用而已。其他操作系统上也有类似的概念,例如,软链接(soft link)等。
最后,很多操作系统为了实现接口的统一性,将所有的 I/O 设备都抽象成了文件的概念,使用这一理念最为知名的就是 Unix、Linux 操作系统 —— 万物皆文件
技巧:
将文件拖入记事本,能看懂就是文本文件,看不懂就是二进制文件

Java 中操作文件

在这里插入图片描述
站在CPU的角度,将数据从内存读到硬盘中,是输出,从硬盘读取到内存中,是输入
本节内容中,我们主要涉及文件的元信息、路径的操作,暂时不涉及关于文件中内容的读写操作。
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件

构造方法

在这里插入图片描述

方法

在这里插入图片描述

packageThread;importjava.io.File;importjava.io.IOException;publicclass demo1 {publicstaticvoidmain(String[] args)throwsIOException{File file =newFile("d:/text.txt");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}}

在这里插入图片描述

packageThread;importjava.io.File;importjava.io.IOException;publicclass demo1 {publicstaticvoidmain(String[] args)throwsIOException{File file =newFile("./text.txt");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}}

在这里插入图片描述
这里的getAbsolutePath会将工作路径与设定的当前路径相结合,工作路径就是程序所在的路径,getCanonicalPath则是会将getAbsolutePath合成的目录进行整理优化,去掉冗余的部分

创建文件

packageThread;importjava.io.File;publicclass demo2 {publicstaticvoidmain(String[] args){File file =newFile("./text.txt");System.out.println(file.exists());System.out.println(file.isFile());System.out.println(file.isAbsolute());}}

在这里插入图片描述
在这里插入图片描述

packageThread;importjava.io.File;importjava.io.IOException;publicclass demo2 {publicstaticvoidmain(String[] args)throwsIOException{File file =newFile("./text.txt");
        file.createNewFile();System.out.println(file.exists());System.out.println(file.isFile());System.out.println(file.isAbsolute());}}

在这里插入图片描述
在这里插入图片描述
可以看出,第一段代码,由于并没有创建一个text.txt的文件,所以打印都是false,而第二个代码,从目录中可以看到,已经将text.txt创建出来了,由于是newfile创建出来的,所以打印结果是true true false

删除文件

packageThread;importjava.io.File;publicclass demo3 {publicstaticvoidmain(String[] args)throwsInterruptedException{File file =newFile("./text.txt");//        file.delete();
        file.deleteOnExit();Thread.sleep(5000);}}

在这里插入图片描述
上述代码,delate和deleteOnExit都可以将文件删除,不同的是,deleteOnExit是需要等到程序结束后才会将文件删除

创建目录

packageThread;importjava.io.File;importjava.util.logging.FileHandler;publicclass demo4 {publicstaticvoidmain(String[] args){File file =newFile("./textDir");//mkdir一次只能创建一个目录,mkdirs一次可以创建很多个目录
        file.mkdir();//        file.mkdirs();}}

在这里插入图片描述

packageThread;importjava.io.File;importjava.util.logging.FileHandler;publicclass demo4 {publicstaticvoidmain(String[] args){File file =newFile("./textDir/111/222/333");//mkdir一次只能创建一个目录,mkdirs一次可以创建很多个目录//        file.mkdir();
        file.mkdirs();}}

在这里插入图片描述

重命名

packageThread;importjava.io.File;publicclass demo5 {publicstaticvoidmain(String[] args){File file =newFile("./test.txt");File file2 =newFile("./test2.txt");
        file.renameTo(file2);}}

我们先将file文件给创建出来,再利用rename将file文件名改为filename
在这里插入图片描述
在这里插入图片描述
rename还可以起到文件移动的作用

packageThread;importjava.io.File;publicclass demo5 {publicstaticvoidmain(String[] args){File file =newFile("./test.txt");File file2 =newFile("./src/test2.txt");
        file.renameTo(file2);}}

在这里插入图片描述
此时文件test.txt已经从src目录外面给挪到src里面去了

文件内容的读写 —— 数据流

文件这里的内容本质是来自于硬盘,硬盘又是操作系统管理的,使用某个编程语言操作文件,本质上都是需要调用系统的api,
虽然不同的编程语言,操作文件的api有所差别,但是,基本步骤都是一样的,
文件内容的操作核心步骤,有四个
1.打开文件
2.读文件
3.写文件
4.关闭文件

InputStream/OutputStreadm(字节流)

后续的一些操作字节的类都是衍生自这两个类,是操作字节为单位(二进制文件)

Reader/Writer(字符流)

后续的一些操作字符的类都是衍生自这两个类,是操作字符为单位(文本文件)
javaIO流是一个比较庞大的体系,涉及到非常多的类,这些不同类,都有各自不同的特性,但是总的来说,使用方法都是类似的,
1.构造方法,打开文件
2.close方法,关闭文件,
3.如果衍生自InputStream或者Read,就可以使用read方法来读数据
4.如果衍生自OutputStreadm或者Writer,就可以使用writer方法来读数据
接下来,我们来举个例
先提前再d盘创建一个文件,写入一些数据后,我们尝试将利用程序其打开并读取

在这里插入图片描述
在这里插入图片描述

packageThread;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.io.Reader;//Read的使用publicclass demo6 {publicstaticvoidmain(String[] args)throwsIOException{Reader reader =newFileReader("D:/Data/test.txt");try{}finally{
            reader.close();}}}

这里的close非常重要,是用来释放不必要的资源的,这是因为,让一个进程打开一个文件,是需要从系统中申请一定的资源的(占用进程的pcb里的文件描述符表中的资源,这里的表是一个顺序表,长度有限,不会自动扩容)
,如果不释放,就会出现"文件资源泄露"这个很严重的问题,一旦一直打开文件,而又不去关闭不用的文件,文件描述符表就会被占满,后续就无法继续打开新的文件了
上述的finally虽然也能够解决问题,但是不够优雅,我们可以使用try with resources

packageThread;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.io.Reader;//Read的使用publicclass demo6 {publicstaticvoidmain(String[] args)throwsIOException{try(Reader reader =newFileReader("D:/Data/test.txt")){//只要try代码块执行完了,就会自动调用到close//括号里面还可以创建多个对象,用;隔开}}}

文件流中的任意对象,都可以按照上述的讨论来进行close

标签: java

本文转载自: https://blog.csdn.net/qq_65291053/article/details/132565280
版权归原作者 墨溱 所有, 如有侵权,请联系我们删除。

“文件操作IO”的评论:

还没有评论