目录
文件
平时我们说的文件一般都是指存储在硬盘上的普通文件,形如 txt,jpg,mp4,rar等这些文件都可以认为是普通文件,它们都是在硬盘上存储的,在计算机中,文件可能是一个广义的概念,就不只是包含普通文件,还可以包含目录(其中,我们把目录称为目录文件),在操作系统中,还会使用文件来描述一些其他的硬件设备或者软件设备,例如网卡,操作系统中就把网卡这样的硬件设备也给抽象成了一个文件。
文件的分类
以我们的角度看,我们主要吧文件给分成两类:1. 文本文件。2.二进制文件
文本文件:文本文件中里面存储的都是字符,文本文件本质上也是存字节的,但是文本文件中,相邻的字符在一起正好能构成一个个的字符。
二进制文件:二进制文件里面存储的都是字节,这样的话字节与字节之间就完全没有啥关系了。
这里有一个小技巧告诉大家怎么去判定一个文件是文本文件还是二进制文件,就是用记事本打开这个文件,如果打开后显示为乱码,这就说明这个文件是一个二进制文件,不是乱码那么就说明就是文本文件。
路径
计算机中,保存管理文件,是通过操作系统中的“文件系统”这样都模块来负责的,在文件系统中,一般都是通过“树形”结构来组织磁盘上的目录和文件的,当我们打开一个磁盘,就会出现多个文件,而每个文件又包含多个文件,整体的文件系统,就是这种树形结构,如果是一个普通文件,就是树的叶子结点,如果是一个目录文件,目录中就可以包含字数,这个目录就是非叶子节点,这个数的每个节点上的字数都可以有N个,这就是一个N叉树了,这样就有了路径这个概念。
在操作系统中,就通过“路经”这样的概念,来描述一个具体文件/目录的位置,路径这里有两种描述风格:绝对路径和相对路径
1.绝对路径:以盘符开头的 例如:D:\Xiillldddd
2.相对路径:以 . 或者 .. 开头的,其中. 表示当前路径 ,.. 表示当前路径的父目录(上级路径),这里我们谈到相对路径,就必须要先有一个基准路径,相对路径就是从基准目录出发,按照一个啥样的路径找到的对应文件,下面我们来举个栗子
例如:以D:\Program Files\WeGame为基准目录 找到D:\Program Files\WeGame\client_config的位置,这是我们就可以./client_config表示 ,此处的 . 就表示当前目录,也就是基准目录
.. 表示基准目录上一级路径D:\Program Files
所以,当我们定位到同一个文件,如果基准目录不同,此时相对路径也不同。
Java中操作文件
在Java中操作文件,主要是包含两类操作:1.文件系统相关的操作。 2.文件内容相关的操作
文件系统相关操作
文件系统相关操作指的是通过“文件资源管理器”能够完成的一些功能,如创建文件,创建目录,删除文件,重命名文件等,在 Java 中提供了一个File类, 通过这个类来完成上述的操作,首先这个File类就可以描述了一个文件/ 目录,基于这个对象就可以实现上面的功能,File的构造方法,能够通过传入一个路径,来制定一个文件,这个路径可以是绝对路径也可以是相对路径,当我们构造玩对象之后,就可以通过File提供的方法 ,来完成一系列具体的功能了
文件操作也是一种输入输出 所以File这个东西就是在IO中了
在输入输出的过程中我们要抛出一个异常,通过运行,我们找到上面对应路径 就会发现自动创建了一个text的文本文件
那我们就会想到,这是绝对路径呀,如果这里我们用相对路径会是在哪创建呢?基准路径是啥哪?这里我们不知道,所以我们自己运行下试试
通过运行,我们发现左边多出了一个text文件,那么我们知道了,这里的基准路径就是当前Java项目所在的路径
还有很多文件系统相关的操作,Java中也提供了对应的方法,大家可以抽空在API文档上查看
文件内容相关操作
1.打开文件 2.读文件 3. 写文件 4.关闭文件
针对文件内容的读写,Java标准库中提供了一组类,首先按照文件的内容,分成了两个系列
1.字节流对象
字节流对象是针对二进制文件,是以字节为单位进行读写的 读:InputStream 写:OutputStream
2.字符流对象是针对文本文件,是以字符为对象进行读写的 读: Reader 写:Writer
上述提到的四个类都是抽象类,在我们实际使用中,我们往往使用的是这些类的子类
1.FileInputStream 2.FileOutputStream 3.FileReader 4.FileWriter 这四个都是特指对普通文件进行读写的
下面我们用FileInputStream举个例子
首先创建对象并且打开文件
然后我们通过read方法来读取文件中的数据
我们可以看到read提供了三个版本的重载
1.无参版本:一次读一个字节,返回值是读到的这个字节
2.一个参数版本:一次读若干个字节,把读到的字节放到参数指定的数组中,返回值就是读到的字节数
3.三个参数版本:一次读若干字节,把读到的结果放到蚕食指定的数组中,返回值就是读到的字节数,不是从数组的起始位置放置,而是从中间的位置放置(off这个下标的位置) len 表示最多能放多少个字节
这里当读完了就会返回-1
所以我们就可以设置一个循环,来读取文件中的数据
同时需要抛出异常
读完后关闭文件
但我们会想到,如果前面读的过程中抛出异常了呢这样就可能导致close()关闭不了,所以我们就需要吧close()放到finally里面
我们在文件中输入一串字符接下来运行代码
接下来,我们进行写文件
写文件我们用到OutputStream ,创建一个数组,我们按照这种方式发开文件读写,每次打开文件都会清空原有文件的内容,清空旧的内容,在从起始位置往后写的,还有一种用于追加流对象,打开开之后不清空。在文件末尾据需往后写FileOutpputStream
用这个构造方法 的时候将后面的参数设置为true