IO流
分类:
1、流向
A:输入流:读取数据
B:输出流:写入数据
2、数据类型
A:字节流
a:字节输入流 :读取数据 (抽象类的基类:InputStream)
b:字节输出流 :写入数据 (抽象类的基类:OutputStream)
B:字符流
a:字符输入流 :读取数据 (抽象类的基类:Reader)
b:字符输出流 :写入数据 (抽象类的基类:Writer)
一般情况下,如果没有明确说明按那种类型分类,默
认情况下,按照数据类型来分。
## 由于流对象是一个抽象类,不能被实例化,所以要找到一个具体的子类
每种类型的流,都是以父类名作为后缀
XXXInputStream
XXXOutputStream
XXXReader
XXXWriter
构造方法
XXXOutputStream(File file)
XXXOutputStream(String name)
。。。。。。。
创建字节输出流对象之后系统的运行步骤
1、调用系统功能去创建文件
2、创建文件输出流对象
3、把对象指向这个文件
字节输出流的操作步骤
1、创建字节输出流对象
2、写数据
3、释放资源
字节流写入数据的方法
public void writer(int b)
写入一个字节
public void writer(byte[] b)
写入一个字节数组
public void writer(byte[] int off,int len)
写入一个字节数组的一部分(int off表示从哪个下标开始写入,int len表示从下标int off 开始 写入数组元素的个数)
如何实现数据的换行
1、写入换行符(回车的转义字符"\n")
2、针对不同的系统,换行的识别符号是不一样的
windows :\r\n
linux: \n
MacOS: \r
3、一些高级记事本可以识别任意的换行符号
如何实现数据的追加写入
构造方法第二个参数写true即可
创建一个向指定文件写入数据的输出文件流,第二个参数为true,则将字节写入文件末尾处。
FileOutputStream fos = new FileOutputStream(test2.txt,true);
对流对异常处理
字节输入流操作步骤(FileInputStream)
1、创建字节输入流对象
2、调用read()方法读取数据,并把数据显示在控制台
3、释放资源
字节输入流适合读取一些没有中文的文件,如果要读取有中文字符的文件,用字符输入流。
读取数据对方法
1、int read() 读取一个字节
2、int read(byte[] b) 一次读取一个字节数组
read()方法类似于迭代器中的next()的方法,读完一个元素,读取位置移动到下一个元素。
当读取位置到达文件末位是,则返回值为-1。
使用输入输出流复制文本文件中的内容
数据源
test.txt ---- 读取数据 ---- FileInputStream
目的地
test2.txt ---- 写数据 ---- FileOutputStream
将test.txt中的内容,复制到test.txt中
在计算机中,一个字节用来表示符合和英文,两个字节用来表示中文,在运行过程中是如何识别把两个字节拼接在一起转换为中文?
1、中文分为两个字节,第一个字节肯定是负数。
2、第二个字节常见的是负数,可能是正数,但是没有影响
使用输入输出流复制文件
需求:把某一目录下的文件,复制到另一个目录
数据源
Downloads文件夹下的 cosmos.jpg ---- 读取数据 ---- FileInputStream
目的地
Documents 文件夹下 ---- 写入数据 ---- FileOutputStream
使用int read(byte[] b)方法读取,再用writer(byte[] b)复制写入
使用输入输出流批量复制文件
需求:找出目标目录下的.mp4文件和.avi文件,.mov文件,复制到指定的目录中
字节缓冲流
字节流一次读取一个字节数组的速度,明显比一次读写一个字节的速度快,这是加入了数组这样的缓冲区效果,Java在设计的时候也考虑到了这样的设计思想(装饰设计模式)提供了字节缓冲区流
字节缓冲输出流
BufferedOutputStream
字节缓冲输入流
BufferedInputStream
构造方法可以指定缓冲区大小,一般用不上,默认的缓冲区大小基本够用
字节缓冲流,仅提供缓冲区,为高效而设计,真正的读写操作还是靠基本的流对象来实现的,所以字节缓冲区流的构造方法,不能传递一个具体的文件或者文件路径,而是传递一个OutputStream对象。
测试字节流和缓存流的效率比较(分别用两种方式:读写字节和读写字节数组)
将文件 西门庆大战多啦A梦.avi复制到指定目录下