八、Java IO

八、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):将字节流以字符流输入。

                这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值