关于文件
关于IO的定义
I:input输入 O:output输出,这是一套人为规定的规则,下面这个图方便我们理解输入输出的定义,统一以CPU为基准
在操作系统中其实把很多的资源都抽象成文件,我们在这里所说的文件就是"狭义"文件,平时保存在硬盘上的文件,
文件夹也是一种文件,我们称之为目录文件,在硬盘上存储着很多文件和目录,目录之间又存在这一套嵌套关系,这整个结构是一个树形结构N叉树,
路径
相对路径:起点可以是任意路径, 一个.表示当前路径的位置,两个..可以回退到上个路径
绝对路径:起点只能是此电脑,以盘符开头
文本文件和二进制文件
文本文件是合法的字符串,每个字符都是合法的,文本文件中的"二进制数据"能够构成合法的字符,字符集有GBK,UTF8,都对应一个码表,啥样的数字就对应啥样字符,这个码表只包含了一小部分二进制数据,这些被包含了的字符,并且是有意义的我们称之为文本文件,还有很多没有被包含,没有意义是一堆乱码的我们称之为二进制文件
如何区分一个文件是文本文件(可以看懂)还是二进制文件(乱码我们看不懂):可以将文件用记事本打开即可,对后续代码编写具有重要作用
使用Java进行文件操作
1)对文件系统进行操作
创建文件,删除文件,创建目录,重命名文件 使用标准库中的File
代码演示
绝对路径的情况
相对路径的情况
创建文件可能会抛出异常,抛出异常的原因:1)非法路径,2)没有权限
可以发现当文件创建好之后会在idea中新增一个文件
2)对文件内容进行操作
读文件,写文件,打开文件,关闭文件
Java中通过"流"这样的一组类,来进行上述的文件内容操作,分为字节流和字符流
字节流:outputStream,inputStream,以字节为单位,处理二进制文件
InputStream是一个抽象类,不能实例化一个对象,我们需要通过子类来实例化,使这个类变成具体的类,
我们可以通过FileInputStream来实例化对象,同时需要抛出异常,因为这个文件可能不存在
read方法有三个,第一个是每一次读取一个字节,但是返回值是int,查看一下文档注释,因为是文字所以是无符号Byte范围从0-255,都是正数,没有负数,所以使用int类型来做为返回值接收,当读取到文件结束时会返回-1作为文件结束标志,
这个方法更高效,能够减少IO次数比起第一个方法,大大提升了效率
close关闭文件,关闭文件也是一个核心操作,因为我们在打开文件的时候,会在操作系统内核PCB结构体中,给"文件描述符表"中新增一个元素,这个"文件描述符表",有具体大小存在上限 不会自动扩容,如果内存满了再次打开文件就会失败,所以关闭文件是非常重要的,多个线程共用同一份文件描述符表,当然文件描述符表也是可以进行配置的
try with resources,try里面必须是实现Closeable接口的类,自动调用close
OutStream
最重要的操作是写操作write,只要以OutStream的方式打开文件都会把之前文件内容给清空,默认方式打开会清空文件,我们要以追加的方式来打开文件,需在构造方法中把append这个参数设置为true,
字符流:Readr,Writer,以字符为单位,处理文本文件
read,
write
在Java当中内部类型采取的编码方式也会有不同,char是Unicode(2个字节)而String是utf8(3个字节),Java内部会自动转码
核心操作:1)通过构造方法打开文件,2)通过read方法来读取文件,3)通过write方法来写文件,4)通过close方法来关闭文件