八、IO
1、在Java中有输入、输出两种IO流,每种输入、输出流又分为字节流和字符流两大类。
①、字节:每个字节(byte)有8bit组成。
②、字符:我们可能知道代表一个汉字或者英文字母。
③、字节与字符的关系:Java采用unicode编码,通讲,2个字节来表示一个字符。在0~127整数之间的字符映射,unicode向下兼容ASCII,也就是1个字节表示一个字符。一个中文或英文字符的unicode编码都占2个字节。
2、IO流的分类
(1)、流的方向
输入输出流是相对于内存而言的。
①、输入流(读数据):输入流是读取外部文件输入到内存
②、输出流(写数据):输出流是从内存输出到外部文件
(2)、流的类型
①、字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的。
②、字符流:字符流只能操作纯字符数据,比较方便。
3、字节流和字符流的区别
(1)、字符流使用了缓冲区,通过缓冲区再操作文件;而字节流没有使用缓冲区,是文件本身直接操作的。
缓冲区:缓冲区可以简单地理解为一段特殊的内存。某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
(2)、字节流和字符流相对而言使用字节流会更好。因为所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。字节流可以处理所有类型数据,如:图片、MP3、AVI视频文件;而字符流只能处理字符数据,纯文本数据。只要是处理纯文本数据,就优先考虑使用字符流,除此之外都使用字节流。
(3)、InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。Reader是所有读取字符串输入流的祖先,而Writer是所有输出字符串的祖先。InputStream、OutputStream、Reader、Writer都是抽象类。所以不能直接new实例对象。
(4)、程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
4、IO流对象
(1)、InputStream(抽象类)
所有的输入字节流的父类
①、ByteArrayInputStream:从Byte数组中读取数据
②、FileInputStream:从本地文件中读取数据
③、FilterInputStream:装饰流
④、ObjectInputStream:装饰流
⑤、PipedInputStream:从与其它线程共用的管道中读取数据
⑥、StringBufferInputStream:从StringBuffer中读取数据
⑦、SequenceInputStream:
⑧、AudioInputStream:
(2)、OutputStream(抽象类)
①、ByteArrayOutputStream:向Byte数组中写入数据
②、FileOutputStream:向本地文件中写入数据
③、FilterOutputStream:装饰流
④、ObjectOutputStream:装饰流
⑤、PipedOutputStream:向与其它线程共用的管道中写入数据
(3)、Reader(抽象类)
①、CharArrayReader:从Char数组中读取数据
②、InputStreamReader:是一个连接字节流和字符流的桥梁,它将字节流转变为字符流,其子类FileReader就是一个实现此功能的具体工具类
③、StringReader:从String中读取数据
④、BufferedReader:装饰器,它和其子类负责装饰其它Reader对象
⑤、PipedReader:从与其它线程共用的管道中读取数据
⑥、FilterReader:是所有自定义具体装饰流的父类
(4)、Writer(抽象类)
①、CharArrayWriter:向Char数组中写入数据
②、OutputStreamWriter:是OutputStream到Writer转换的桥梁,其子类FileWriter就是一个实现此功能的具体工具类
③、StringWriter:向String中写入数据
④、BufferedWriter:是一个装饰器为Writer提供缓冲功能
⑤、PipedWriter:向与其它线程共用的管道中写入数据
⑥、PrintWriter:是一个辅助工具。主要可以向其他输出流,或者FileInputStream写入数据,本身内部实现还是带缓冲的。
⑦、FilterWriter:是所有自定义具体装饰流的父类
(5)、File(非流式文件类)
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
(6)、字节流和字符流的转换
①、转换流
将字节流转换为字符流,同时也可以将字符流转化为字节流。字节流和字符流之间通过InputStreamReader和OutputStreamWriter来关联,实际上是通过byte[]和String来关联。从字节流转化为字符流时,实际上就是byte[]转化为String。而在字符流转化为字节流时,实际上是String转化为byte[]。
②、InputStreamReader和OutputStreamWriter
OutputStreamWriter(OutStreamout):将字节流以字符流输出。
InputStreamReader(InputStream in):将字节流以字符流输入。
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。