1.IO
a.介绍
i.IO是指Input和Output,即输入和输出,以内存为中心:
1.Input是指从外部读入数据到内存。
2.Output是指把数据从内存输出到外部。
ii.IO流是一种顺序读写数据的模式,它的特点是单向流动。数据类似自来水一样在水管中流动,所以我们把它称为IO流。
b.InputStream/OutputStream
i.IO流以byte(字节)为最小单位,因此也称为字节流。
ii.InputStream代表输入字节流,OutputStream代表输出字节流,这是最基本的两种IO流。
c.Reader/Writer
i.以char(字符)为最小数据单位来读写,这种称为字符流。
ii.Reader和Writer本质上是一个能自动编解码的InputStream和OutputStream。
d.同步和异步
i.同步IO是指,读写IO时代码必须等待数据返回后才继续执行后续代码。优点:代码编写简单;缺点:CPU执行效率低。
ii.异步IO是指,读写IO时仅发出请求,然后立刻执行后续代码。优点:CPU执行效率高,缺点:代码编写复杂。
2.File
a.File对象
i.文件是非常重要的存储方式。Java标准库java.io提供了File对象来操作文件和目录。
ii.构建File对象时,需要传入文件路径:可以是绝对路径,也可以是相对路径。
iii.Windows平台使用 \ 作为路径分隔符,在Java中需要用 \\ 表示一个 \ 。Linux平台用 / 作为分隔符路径。
iv.可以用 . 表示当前目录,用 .. 表示上级目录。
v.File对象有3种形式表示的路径,getPath():返回构造方法传入的路径;getAbsoluteFile():返回绝对路径;getCanonicalFile():返回规范路径。
b.文件和目录
i.File对象既可以表示文件也可以表示目录。构建File对象时,并不会对磁盘做任何操作,调用File对象的某些方法时,才真正进行磁盘操作。
c.创建和删除文件
i.当File对象表示一个文件时,可以通过createNewFile()方法创建一个新文件,用delete()删除该文件。
d.Path
i.Java标准库还提供了一个Path对象,位于java.nio.file包。
ii.如果需要对目录进行复杂的拼接、遍历等,使用Path对象更方便。
3.InputStream
a.简介
i.Java库提供的最基本的输入流。
ii.不是接口,是抽象类,是所有输入流的超类。
iii.int read()方法:会读取输入流的下一个字节,并返回字节的int值,如果读到末尾,返回-1表示不能继续了。
iv.在计算机中,类似文件、网络端口这些资源,都是由操作系统统一管理的。应用程序在运行过程中,打开文件需要及时关闭,以便让操作系统及时释放资源。
v.InputStream和OutputStream都是通过close()方法关闭流,关闭流就会释放对应的底层资源。
vi.try(resource)的语法,编译器会自动关闭资源。实际上,编译器并不会特地为InputStream加上自动关闭, 编译器只看try(recource=...)中的对象是否实现了java.lang.AutoCloseable接口,实现了,就自动加上finally语句并调用close()方法。
b.缓冲
i.在读取流时,一次读取一个字节效率低,很多流支持一次性读取多个字节到缓冲区,利用缓冲区一次性读取多个字节效率就高很多。
ii.两个方法
1.int read(byte[] b):读取若干字节并填充到byte[]数组,返回读取的字节数。
2.int read(byte[] b, int off, int len):指定byte[]数组的偏移量和最大填充数。
iii.一次读取多个字节,需要先定义一个byte[]数组作为缓冲区,read()方法会尽可能多的读取字节到缓冲区,但不会超过缓冲区的大小。
c.阻塞
i.调用InputStream的read()方法读取数据时,read()方法是阻塞的,即必须等read()方法返回后才能继续。读取IO流比执行普通代码,速度慢很多。
d.InputStream实现类
i.ByteArrayInputStream:把一个byte[]数组在内存中变成一个InputStream。
4.OutputStream
a.简介
i.Java标准库提供的最基本的输出流。
ii.不是接口,是抽象类,所有输出流的超类。
iii.void write(int b)方法:虽然是int参数,但是只会写入一个字节到输出流。
iv.提供了flush()方法,它的目的是将缓冲区的内容真正输出到目的地。
1.出于效率考虑,操作系统并不是一个个字节输出,而是把输出的字节放到内存缓冲区(本质上是一个byte[]数组),等待缓冲区写满,一次性写入文件或网络。一次写1个字节和一次写1000个字节时间几乎一样,flush()方法能够强制把缓冲区内容输出。
2.通常情况下,不需要我们调用,缓冲区写满后、close()方法关闭前,OutputStream会自动调用flush()方法。
3.某些情况下,需要我们手动调用flush()方法来强制输出缓冲区。
b.FileOutputStream
i.文件输出流,从内存输出内容到外部。
ii.一次性写入若干字节,调用write(byte[])来实现。
iii.try(resource)来保证OutputStream在无论是否发生IO错误的时候都能正确关闭资源。
c.阻塞
i.调用OutputStream的write()方法时,write()方法是阻塞的,即必须等write()方法返回后才能继续。输出IO流比执行普通代码,速度慢很多。
d.OutputStream实现类
i.ByteArrayOutputStream:把一个byte[]数组在内存中变成一个OutputStream。
ii.同时操作多个AutoCloseable资源时,在try(resource){...}语句中可以同时写出多个资源,用;隔开。