黑马程序员——基础知识——IO流

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

Day20

20.01 IO流的概述及其分类

       1、概念

              IO流用来处理设备之间的数据传输

              Java对数据的操作是通过流的方式

              Java用于操作流的类都在IO包中

              流按流向分为两种:输入流、输出流

              流按操作类型分为两种:

                     字节流:字节流可以操作任何数据,因为在计算机中任何数据都是

以字节形式存储的

                     字符流:字符流只能操作纯字符数据,比较方便

              各个国家语言不一样,所以有不同的编码表,所以字节要通过对应的码

表转换为字符流,如果不用字符流容易出现乱码。

       2、IO流常用父类

              字节流的抽象父类:(不能用来创建对象)                

                     InputStream

                     OutputStream    

              字符流的抽象父类:

                     Reader

                     Writer

       3、IO程序书写

              使用前,导入IO包中的类

              使用时,进行IO异常处理,因为IO流操作的是硬盘和内存,很有可能

不存在,就会出现异常

              使用后,释放资源,在内存和硬盘之间相当于建立了一个管道,所以要

释放资源

 

20.02 FileInputStream

       InputStream是一个抽象类,不能直接new对象

       FileInputStream操作文件的流

read()一次读取一个字节


黑马程序员——基础知识——IO流_第1张图片

20.03 read()方法返回值为什么是int

       1、read()方法读取的是一个字节,为什么返回时int,而不是byte

       10000001 byte类型-1的原码    byte的取值范围-128~127

       11111110 -1的反码

       11111111 -1的补码,而计算机操作的都是补码

              因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件

底层都是以二进制形式存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到11111111,那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据读不到了,所以在读取的时候用int类型接收,如果是11111111会在前面不上24个0凑足4个字节,那么byte类型的-1就会变成int类型的255了,这样可以保证整个数据读完,而结束标记的-1就是int类型。

       读每一个字节都会补24个0

       虽然read将字节提升为了int,但是write在写的时候会去掉24个0,将其变回byte类型

 

20.04 FileOutputStream

       write()一次写出一个字节


黑马程序员——基础知识——IO流_第2张图片

20.05 FileOutputStream追加

       1、案例演示

              FileOutputStream的构造方法写出数据如何实现数据的追加写入


黑马程序员——基础知识——IO流_第3张图片

20.06 拷贝图片

       1、FileInputStream读取

       2、FileOutputStream写出

 

20.07 拷贝音频文件画原理图

       1、案例演示

              字节流一次读写一个字节复制音频

       弊端:效率太低


黑马程序员——基础知识——IO流_第4张图片

20.08 字节数组拷贝之available()方法

       1、案例演示

              int read(byte[] b) 一次读取一个字节数组

              write(byte[] b)一次写出一个字节数组

              available()获取读取的文件所有字节个数

       第二种拷贝:定义一个大数组拷贝,弊端:有可能会内存溢出

黑马程序员——基础知识——IO流_第5张图片

20.09 定义小数组

       write(byte[] b)

       write(byte[] b , int off ,int len) 写出有效的字节个数



20.10 定义小数组的标准格式

       1、案例演示

              字节流一次读写一个字节数组复制图片和视频

黑马程序员——基础知识——IO流_第6张图片

20.11 BufferedInputStream和BufferedOutputStream拷贝

       1、缓冲思想

              字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多

              这是加入了数组这样的缓冲区效果,Java本身在设计的时候,也考虑到

              了这样的设计思想(装饰设计模式),所以提供了字节缓冲区流。

构造函数BufferedInputStream(InputStream in) 相当于对InputStream进行了包装。

相当于自带了数组方便拷贝

       2、BufferedInputStream

              BufferedInputStream内置了一个缓冲区(数组)

              从BufferedInputStream中读取一个字节时,BufferedInputStream会一次

       性从文件中读取8192个,存在缓冲区中,每次返回给程序一个。程序再次

读取时,就不用找文件了,直接从缓冲区中获取,直到缓冲区中所有的都被使用过,才重新从文件中读取8192个

       3、BufferedOutputStream

              BufferedOutputStream也内置了一个缓冲区(数组)

              程序向流中写出字节时,不会直接写到文件,而是先写到缓冲区中,直

       到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文

件中

4、拷贝的代码


黑马程序员——基础知识——IO流_第7张图片

5、小数组的读写和带Buffered的读取那个更快?

              定义小数组如果是8192个字节大小和Buffered比较的话,定义小数组会

略胜一筹,因为读和写操作的是同一个数组,而Buffered操作的是两个数组。

       其实两种方式都可以

 

20.12 flush和close方法的区别

       1、flush()方法

              用来刷新缓冲区的,刷新后可以再次写出

       2、close方法

              用来关闭流释放资源的,如果是带缓冲区的流对象的close方法,不但会

关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出。

20.13 字节流读写中文

       1、字节流读取中文的问题

              字节流在读中文的时候有可能会读到半个中文或标点,造成乱码      

       2、字节流写出中文的问题

              字节流直接操作的字节,所以写出中文必须将字符串装换成字节数组

              写出回车换行 write(“\r\n”.getBytes());



20.14 流的标准处理异常代码1.6版本及其以前

       try finally嵌套

       finally不能单独使用,必须和try一起使用

       

20.15 流的标准处理代码1.7版本

       1、try close



原理:在try()中创建的流对象必须实现了AutoCloseable这个接口,如果实现了,在try后面的{}(读写代码)执行后就会自动调用,流对象的close方法将流关掉

 

20.16 图片加密


黑马程序员——基础知识——IO流_第8张图片

20.17 拷贝文件

       在控制台录入文件的路径,将文件拷贝到当前项目下



20.18 录入数据拷贝到文件

       1、将键盘录入的数据拷贝到当前项目下的text.txt文件中,键盘录入数据当遇到quit时就退出




你可能感兴趣的:(黑马程序员——基础知识——IO流)