IO流

一、概述

  流是磁盘或其他外围设备中存储的数据的源点或终点。标准输入输出、文件的操作、网络上的数据流、字符串流、对象流、zip文件流等,java将输入输出抽象为流。

  数据流分类:既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。

  1. 字节流:数据流中最小的数据单元是字节

  2. 字符流:数据流中最小的数据单元是字符,java中的字符是Unicode编码,一个字符占用两个字节

  1. 输入流:只能读不能写,基类为InputStream(字节输入流),或者Reader(字符输入流)

  2. 输出流:只能写不能读,基类为OutputStream(字节输出流),或者Writer(字符输出流)

 

二、InputStream

  InputStream为字节输入流的超类,为抽象类,必须依靠子类实现各种功能。传输的数据单元为字节(8bit),提供了3种重载的read()方法

  1. public abstract int read():读取一个byte的数据,返回值是高位补0的int类型值。若返回值为-1说明没有读取到任何字节,读取工作结束

  2. public int read(byte[] b):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。

  3. public int read(byte[] b, int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中

  4. public int available():返回输入流中可以读取的字节数

  5. public long skip(long n):忽略输入流的n个字节,返回值是实际忽略的字节数

  6. public int close():使用完,必须对打开的流进行关闭

 

  inputStream的实现类为:

  1.FileInputStream把一个文件作为InputStream,实现对文件的读取操作

  2. ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用

  3. StringBufferInputStream:把一个String对象作为InputStream

  4. PipedInputStream:实现了pipe的概念,主要在线程中使用

  5. SequenceInputStream:把多个InputStream合并为一个InputStream

 

三、OutputStream抽象类

  OutputStream提供了3个writer方法来做数据的输出

  1. public void write(byte b[]):将参数b中的字节写到输出流

  2. public void write(byte b[], int off, int len):将参数b的从偏移量off开始的len个字节写到输出流

  3. public abstract void write(int b):先把int转换为byte类型,把低字节写入到输出流

  4. public void flash():将数据缓冲区中数据全部输出,并清空缓冲区

  5. public void close():关闭输出流并释放与流相关的系统资源

 

  OutputStream实现类

  1. ByteArrayOutputStream:把信息存入内存中的一个缓冲区中

  2. FileOutputStream:把信息存入文件中

  3. PipedOutputStream:实现了pipe的概念,主要在线程中使用

  4. SequenceOutputStream:把多个OutStream合并为一个OutStream

  OutputStream流结束的判断:方法read()的返回值为-1时;readLine()的返回值为null时

 

四、文件输入流FileInputStream类 

  FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。

  作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类。

 

五、文件输出流FileOutputStream类

  作用:用来处理以文件作为数据输出目的的数据流;或者说是从内存区读数据入文件.

  注意: (1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。

 

六、缓冲输入输出流 BufferedInputStream/ BufferedOutputStream

  计算机访问外部设备非常耗时。访问外存的频率越高,造成CPU闲置的概率就越大。为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。这样可以减少访问硬盘的次数,提高传输效率。 

  BufferedInputStream当向缓冲流读取数据时,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。 

  BufferedOutputStream当从缓冲区读取数据时,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取到缓冲区。

 

七、字符流Writer/Reader

  java中字符是采用Unicode标准,一个字符是16位,使用两个字节表示。为此,java中引入了处理字符的流。

  Reader抽象类:

  用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。 

  Writer抽象类:

  写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

  Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为其分配内存 

  Writer类能够将内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。

  

  

  

 

posted @ 2019-03-31 11:02  欣欣向荣666  阅读(125)  评论(0)    收藏  举报