您的位置:首页 > 其它

IO流

2016-06-12 23:26 295 查看
在Java中把一组有序的数据序列称为流,按操作类型流可以分为输入流(从文件、内存、键盘等数据源中读取数据)和输出流(从数据源读取的数据经过处理写入文件、内存、控制台等数据汇中),按最小数据单元可分为字节流(读写二进制及任何类型的文件)和字符流(读写各种编码的文本文件)。

一、字节输入/输出流

1.ByteArrayInputStream/ByteArrayOutputStream:把字节数组类型转换为输入/输出流类型使程序能够对字节数组进行读/写操作

2.FileInputStream/FileOutputStream:从文件中读/写数据,注意:如果文件中含有中文建议使用字符流读取否则可能出现中文乱码,因为中文字符在UTF-8编码下占3个字节,在GBK编码下占2个字节,如果使用字节流正好将中文拆开读取则会出现乱码

3.PipedInputStream/PipedOutputStream:通常由一个线程向管道输入流中写入数据另一个线程从管道输出流中读取数据,两个线程通信时使用。当输入流线程read方法无法读取到数据时线程被阻塞直到输出流线程向写入新的数据后才恢复运行

4.SequenceInputStream:将几个输入流串联起来合并为一个输入流,当通过这个流读取数据时会依次读取

5.DataInputStream/DataOutputStream:FilterInputStream/FilterOutputStream的子类,实现了DataInput接口,用于读写基本类型数据,注意:(1)close方法会自动调用被装饰的输入输出流的close方法(2)两者必须搭配使用,读取和写入的顺序需要一致(3)DataOutputStream写入的是二进制数据,只有UTF编码的字符串可以显示正常

6.BufferedInputStream/BufferedOutputStream:FilterInputStream/FilterOutputStream的子类,利用缓冲区来提高读写数据的效率,默认在缓冲区满的情况下才会真正进行数据写入,可以通过flush方法刷新缓冲区,流关闭时会自动刷新缓冲区

7.PrintStream:FilterOutputStream的子类,和DataOutputStream一样可以输出格式化数据,但会将写入数据的类型转换成字符串后再写入输出流,和BufferedOutputStream一样带有缓冲区,但需注意PrintStream的缓冲区实质上是调用被装饰流的缓冲区,所以必须配合BufferedOutputStream使用,可以在构造PrintStream时设置自动刷新缓冲区参数autoFlush为true,则在输出一个字节数组、print一个换行符或调用println方法时自动调用BufferedOutputStream的flush方法刷新缓冲区

8.AudioInputStream:声音输入流

9.ObjectInputStream/ObjectOutputStream:序列化/反序列化对象,要求对象实现Serializable接口(String、包装类、Date类已经实现),对于一些出于安全原因不能序列化的属性可以使用transient关键字修饰属性禁止默认的序列化,提供自定义的readObject/writeObject方法控制序列化/反序列化的方式

二、字符输入/输出流

1.CharArrayReader/CharArrayWriter:把字符数组类型转换为输入/输出流类型使程序能够对字符数组进行读/写操作

2.StringReader:把字符串类型转换为输入流类型使程序能够对字符串进行读操作

3.InputStreamReader/OutputStreamWriter:把InputStream和OutputStream转换成Reader和Writer,优点是可以指定读取和写入的字符编码

4.FileReader/FileWriter:InputStreamReader/OutputStreamWriter的子类,从文件中读写字符数据,注意:只能按本地平台的字符编码读写数据,不可指定其他字符编码

5.BufferedReader/BufferedWriter:类似BufferedInputStream/BufferedOutputStream,BufferedReader的readLine方法可以一次读入一行字符,而写入一行字符需要使用PrintWriter来装饰BufferedWriter

6.PrintWriter:类似PrintStream,不同的是打印字符串PrintStream采取的是本地字符编码而PrintWriter采用被装饰Writer的编码,PrintStream只能装饰OutputStream而PrintWriter不仅能装饰Writer还能把OutputStream转换成Writer,另外自动刷新缓冲区时PrintWriter只有println方法才会自动刷新

三、其他IO流

1.ImageIO:把图片读取到内存中再输出图片到文件中

2.Scanner:输入文本扫描器,可以指定输入的字符集及读取输入文本的分隔符,从文件或输入流中读取

四、标准IO流(JVM创建,存在于整个生命周期中,始终处于打开状态除非显示关闭)

1.System.in:标准输入流,默认数据源为键盘

2.System.out:标准正常信息输出流,默认输出到控制台

3.System.err:标准错误信息输出流,默认输出到控制台

五、新IO类库(能够提高I/O操作的效率,减少实际物理读写次数,重复使用内存减少动态分配和回收内存的次数)

1.Buffer:新IO类库公开了操作缓冲区的API,使得程序可以直接控制和运用缓冲区,比如flip方法会将缓冲区的极限位置设为当前位置值再把当前位置设为0这样保证对缓冲区中读取到数据的操作仅在当前数据范围内,clear方法会把极限设为容量值再把当前位置设为0这样保证下一次读取操作能读取尽可能多的数据

①ByteBuffer:字节缓冲区,可以把一个字节数组包装成ByteBuffer,也可以生成各种类型的缓冲区视图从而相对或绝对读写各种基本类型数据

②MappedByteBuffer:ByteBuffer的子类,用于创建和修改因为太大而不能放入内存的文件,能够使缓冲区和文件的某个区域直接映射,所有对缓冲区的读写操作都会被映射到对文件的物理读写操作

③CharBuffer:字符缓冲区,存放的数据单元是Unicode编码的字符,可以把字符数组包装成CharBuffer

④DoubleBuffer:存放的数据单元是double数据,可以把double数组包装成DoubleBuffer

⑤FloatBuffer:存放的数据单元是float数据,可以把float数组包装成FloatBuffer

⑥IntBuffer:存放的数据单元是int数据,可以把float数组包装成IntBuffer

⑦LongBuffer:存放的数据单元是long数据,可以把long数组包装成LongBuffer

⑧ShortBuffer:存放的数据单元是short数据,可以把short数组包装成ShortBuffer

2.Channel:数据传输通道,能够把Buffer中的数据写到数据汇中或把数据源的数据读入到Buffer

①ReadableByteChannel/WritableByteChannel:能把数据源的数据读入到ByteBuffer缓冲区中,把ByteBuffer缓冲区中的数据写入到数据汇

②ScatteringByteChannel/GatheringByteChannel:分别扩展ReadableByteChannel/WritableByteChannel,允许分散读取数据(单个读取操作能够填充多个缓冲区)和集中写入数据(单个写操作能够把多个缓冲区的数据写到数据汇),进一步提高输入和输出操作的速度

③ByteChannel:扩展ScatteringByteChannel/GatheringByteChannel,能够同时支持读写操作

④FileChannel:Channel接口的实现类,实现了ByteChannel、ScatteringByteChannel/GatheringByteChannel,代表一个与文件相连的通道,可以通过FileInputStream/FileOutputStream或RandomAccessFile类的getChannel方法获取。新的IO类库引入了文件加锁机制,这种文件锁直接映射到本地操作系统的加锁工具。文件锁分为共享锁(当一个线程已经获取文件的共享锁时其他线程可以获取共享锁但不能获取排他锁,有些操作系统不支持)和排他锁(当一个线程已经获取文件的排他锁时其他线程不可以获取共享锁和排他锁)两种,FileChannel的tryLock和lock方法用于给文件(部分)加锁,两者的区别是前者是非阻塞式的,无法获取锁时返回null而后者是阻塞式的只有获取了锁线程才能恢复运行。

3.Charset:支持Unicode编码与其他编码相互转换

4.selector:支持异步IO操作,也称为非阻塞IO操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: