IO流
按照我的个人理解: File类文件操作是在外部改变文件的,而IO流是从内部改变文件的。总之两者都是为了改变文件而生的。
IO流的使用方法与一般的类相似,先创建对象。 InputStream ins = new FileInputStream();
因为InputStream 是抽象类,所以要用子类的构造方法来创建对象。(利用了自动转型).
InputStream 之中最常用的方法有
int available(): 可以读取的有效字节长度。 返回文件内容中的字节数
int read(): 返回流中的下一个字节作为byte值(一般可以理解为读取了一个字符,返回的是该字符的ASCII码 值) 如果已经读到了流的末尾,则会返回-1.
int read(btye[] b): 用从流中读到的数据都输入到byte数组b中。 (感觉知道这个方法之后,想要直接将流中的数据读入到数组中就方便多了)
与InputStream 相对应的OutputStream 中常用的方法有
void write(byte[] b): 将byte数组中的内容输入到流中。
void wirte(int b) :向流中写入一个byte值(b虽然是int型,但是写入的时候是当做一个字节来写入,如果b的值不在0~255之间,那么就将b加上或者减去256的整数倍,使得运算后的值在0~255之间,再来写入)
读写文件:实现将一个文件读取到程序中,再将文件写入到硬板里面。(相当于是实现了一个文件复制的功能)。
解决这个问题一般有两种方式。一个是用字节流,还有一个是用缓冲流(BufferedInputStream 和 BufferedOutputStream)。
虽然两者读和写的操作都是对一个字节进行的,也就是说每次都只能读取一个字节或者是写入一个字节。但是两者的效率却是相去甚远。
不多说,直接上图(注意:我要拷贝的是一个大小为40M的文件):
实践可以证明,这两个流的效率相差的确实不是一点两点,那么都是读写一个字节,这两差距咋就这么大嘞? 其实,这还要追究到一个字节从读取到写入的具体过程。
就是用字节流一个字节的读写过程要(以文件为例)经过以下几个过程:
文件(硬盘)-à操作系统内存-à虚拟机内存-à程序的变量-à虚拟机内存-à操作系统内存-à文件(硬盘)。
而缓冲流的话会再虚拟机内存中开辟一定大小的缓存区,每次读写的数据都会先存在缓存区当中,当缓存区满了之后再将数据一起进行写入,这样的话整个操作效率就高多了。