史上最骚最全最详细的IO流教程,没有之一( 四 )


2.3 字节输入流(InputStream)
java.io.InputStream抽象类是表示字节输入流的所有类的超类(父类),可以读取字节信息到内存中 。它定义了字节输入流的基本共性功能方法 。
字节输入流的基本共性功能方法:

1、 public void close() :关闭此输入流并释放与此流相关联的任何系统资源 。
2、public abstract int read(): 从输入流读取数据的下一个字节 。
3、 public int read(byte[] b): 该方法返回的int值代表的是读取了多少个字节,读到几个返回几个,读取不到返回-1
FileInputStream类
java.io.FileInputStream类是文件输入流,从文件中读取字节 。
FileInputStream的构造方法
1、 FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream,该文件由文件系统中的 File对象 file命名 。
2、 FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream,该文件由文件系统中的路径名name命名 。
同样的,推荐使用第二种构造方法:
当你创建一个流对象时,必须传入一个文件路径 。该路径下,如果没有该文件,会抛出FileNotFoundException。
构造举例,代码如下:
FileInputStream读取字节数据
  1. 读取字节:read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1,代码测试如下【read.txt文件中内容为abcde】:
循环改进读取方式,代码使用演示:
  1. 使用字节数组读取:read(byte[] b),每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1,代码使用演示:
由于read.txt文件中内容为abcde,而错误数据d,是由于最后一次读取时,只读取一个字节e,数组中,上次读取的数据没有被完全替换【注意是替换,看下图】,所以要通过len,获取有效的字节
 
史上最骚最全最详细的IO流教程,没有之一

文章插图
 
代码如下:
在开发中一般强烈推荐使用数组读取文件,代码如下:
字节流FileInputstream复制图片
复制图片原理
 
史上最骚最全最详细的IO流教程,没有之一

文章插图
 
代码实现
复制图片文件,代码如下:
注:复制文本、图片、mp3、视频等的方式一样 。
到这里,已经从File类讲到了字节流OutputStream与InputStream,而现在将主要从字符流Reader和Writer的故事开展 。
字符流Reader和Writer的故事字符流Reader和Writer的故事从它们的继承图开始,啥都不说了,直接看图
 
史上最骚最全最详细的IO流教程,没有之一

文章插图
 
字符流字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码),这个时候小白同学就看不懂了,没事,咋们先来看个程序:
具体现状分析
 
史上最骚最全最详细的IO流教程,没有之一

文章插图
 
话说,就是你哥我敢摸si,那你哥我肯定也不认识这玩意啊: ??¥??¢????±
字节流读取中文字符时,可能不会显示完整的字符,那是因为一个中文字符占用多个字节存储 。
那字节流就没办法了吗?不,字节流依旧有办法,只是麻烦了点,代码如下:
这是为啥呢?没错解码的正是String,查看new String()的源码,String构造方法有解码功能,并且默认编码是utf-8,代码如下:
尽管字节流也能有办法决绝乱码问题,但是还是比较麻烦,于是java就有了字符流,字符为单位读写数据,字符流专门用于处理文本文件 。如果处理纯文本的数据优先考虑字符流,其他情况就只能用字节流了(图片、视频、等等只文本例外) 。
从另一角度来说:字符流 = 字节流 + 编码表
1、 字符输入流(Reader)java.io.Reader抽象类是字符输入流的所有类的超类(父类),可以读取字符信息到内存中 。它定义了字符输入流的基本共性功能方法 。
字符输入流的共性方法:
1、public void close() :关闭此流并释放与此流相关联的任何系统资源 。
2、 public int read(): 从输入流读取一个字符 。
3、 public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中


推荐阅读