IO(Input Output)流
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的类都在IO包中
流按流向分为两种:输入流,输出流。
流按操作类型分为两种:字节流与字符流。
字节流可以操作任何数据,字符流只能操作纯字符数据,比较方便。
IO流常用父类
字节流的抽象父类:
InputStream ,OutputStream
字符流的抽象父类:
Reader , Writer
读取文件
创建FileInputStream对象, 指定一个文件. 文件必须存在, 不存在则会抛出FileNotFoundException
使用read()方法可以从文件中读取一个字节. 如果读取到文件末尾会读到-1
读取结束后需要释放资源, 调用close()方法关闭输入流
写出文件
创建FileOutputStream对象, 指定一个文件. 文件不存在会创建新文件, 存在则清空原内容. 如果需要追加, 在构造函数中传入true.
使用write()方法可以向文件写出一个字节.
写出结束后同样需要调用close()
拷贝文件
可以从文件中逐个字节读取, 逐个字节写出, 但这样做效率非常低
我们可以定义一个数组作为缓冲区, 一次读取多个字节装入数组, 然后再一次性把数组中的字节写出
使用FileInputStream和FileOutputStream, 逐个字节拷贝
使用FileInputStream和FileOutputStream, 定义一个大数组(length等于文件大小), 一次性拷贝
使用FileInputStream和FileOutputStream, 定义一个小数组(例如1024), 多次拷贝
使用BufferedInputStream和BufferedOutputStream内置的缓冲区, 逐个字节拷贝
常用方法 InputStream: read() 读取一个字节 read(byte[]) 读取若干(数组长度)字节 available() 获取可读的字节数 close() 关闭流, 释放资源 OutputStream: write(int) 写出一个字节 write(byte[]) 写出数组中的所有字节 write(byte[],start,len); close() 关闭流, 释放资源
BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)
从BufferedInputStream中读取一个字节时
BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
程序再次读取时, 就不用找文件了, 直接从缓冲区中获取
直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个
BufferedOutputStream
BufferedOutputStream也内置了一个缓冲区(数组)
程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中
直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里
总结:
在字节流中什么文件都可以读取
所有的文件都是通过0101的数据进行转换而得到的
缓冲区是为了提高字节传输的效率