JAVA IO

流,连续的字节序列。输入流读取这个序列,输出流构建这个序列。InputStream和OutputStream都是操纵的字节。JDK提供了很多包装类来方便处理其他类型数据,如处理java的基本类型DataInputStream和DataOutputStream,读取或者写入对象ObjectInputStream和ObjectOutputStream,finalize中会调用close,但不能依赖finalize

流使用完后都应该正确关闭,在finally或者JDK7的try-with-resoures.如果需要重用输入流,可以用支持mark的流包装,如BufferedInputStream,限制mark,然后在通过reset方法,重置到mark处。或者将输入流的数据转换成字节数组,然后转换成bytearrayinputstream。两种方法都是基于byte数组。

缓冲区,由于流背后的数据可能很大,在实际的操作中,通常使用缓冲区提高性能。传统的缓冲区使用字节数组来完成。而NIO中引入的Buffer及其子类,可以很方便创建何种基本类型的缓冲区,相对于数组来说,Buffer提供了很多方法来对其中的数据进行处理

缓冲区基于position,limit,capacity, get和put方法有绝对和相对,相对是针对当前位置,绝对是针对起始位置,在写入之前一般要调用clear(position设为0,limit设为capacity),在读取之前一般调用flip(limit设为position,position设为0)。还可以支持mark,为避免拷贝数据,使用视图缓冲区,底层使用相同数据

字符与编码,程序中免不了与字符打交道,因为字符是用户可见的,与字符处理相关的就是编码。编码首先要了解字符集,即字符的集合,一般与国家和语言有关,字符集中的每一个字符都对应一个整数。常见的字符集有ISO-8859-1,ASCII,UNICODE等。在计算中表示字符,必须要转换成字节序列。每种字符集可以有多种编码,即生成的字节序列会不同,所有使用不同编码格式做编码解码会有问题。nio的charset包下面的charsetencode和charsetdecode,可以将不同编码的字节序列进行转换,并且提供了更精细的处理,可以屏蔽字符集中没有的字符,java内存中的string,char隐式的意味着编码utf-16。Reader和Writer的处理单元是char,构建的时候指定charset,即也是将其他编码方式的字节序列,转成utf-16形式的字节序列(http://hxraid.iteye.com/blog/559607)

通道,抽象程度比流好,通道即是双向的,使用buffer读写数据。

可中断通道,通过调用close,可让block在该通道的线程收到异常

聚集和分散通道,可以读取和写入多个buffer

文件通道,提供了与其他通道之间高效传输的能力,底层基于操作系统零拷贝,另外可以对文件片段进行加锁,保证多个程序操作相同文件的安全,另外支持内存映射文件,将文件直接映射到内存中

套接字通道,提供非阻塞IO和多路IO复用,非阻塞IO不会阻塞线程,读写不到马上返回,只有socket io支持非阻塞,所用实现selectablechannel的通道通过设置configureblocking来设置是否非阻塞

多路IO是一种新的IO编程模型,传统的方式是使用一连接一线程,而多路复用,可以使用一个线程处理多个socket,通过操作系统提供的select来选择已经就绪的socket来处理,可以吧多个socket注册到一个selector上,然后注册感兴趣的事件,每次调用selector的select方式时,就可以选择到就绪的通道的集合,进行相应的处理,还可以分发给其他线程

你可能感兴趣的:(JAVA IO)