Java NIO、NIO.2学习笔记(二)

2014-11-23 21:50:36 · 作者: · 浏览: 36
()方法可以完成字节序列(ByteBuffer)到字符序列
(CharBuffer、String)的转换最常用的字符集对应的Charset对象
4) StandardCharsets
java7新增了一个StandardCharsets类,该类里包含了ISO-8859-1、UTF-8、UTF-16等静态Field,这些静态Field代表了
4. java.nio.channels.spi
主要包含与Channel相关的服务提供者 编程接口
5. java.nio.charset.spi包
包含与字符集相关的服务提供者编程接口
6. java.nio.file包
早期的 Java只提供了一个File类来访问文件 系统,但File类的功能比较有限,它不能利用特定文件系统的特性,File所提供的方法的性能也不高。而且,其大多数方法在出错时仅返回失败,
并不会提供异常信息
1) Path: 代表了一个平台无关的路径
2) Paths: 包含了2个返回Path的静态工厂方法
2.1) Path get(String first, String... more): 将给定的多个字符串进行拼接
2.2) get(URI uri)
3) Files: 提供了大量的高性能方法来操作文件
4) FileVisitor
使用FileVisitor来遍历文件和目录,在编程时可以通过继承SimpleFileVisitor来实现自己的"文件访问器",这样就可以根据需要,选择性地重写指定方法
5) java.nio.file.attribute
如果程序希望获取关于文件、目录的更多的和特定操作系统、磁盘个性有关的属性,可以使用NIO.2提供的java.nio.file.attribute工具类来实现
5.1) FileAttribute
代表某种文件属性的"集合",程序一般通过XxxAttributeView对象来获取XxxAttribute
5.1.1) BasicFileAttribute
5.1.2) DosFileAttribute
5.1.3) PosixFileAttribute
5.2) FileAttributeView
代表某种文件属性的"视图"
5.2.1) AclFileAttributeView
为特定的文件设置ACL(Access Control List)、及"文件所有者属性"
5.2.2) BasicFileAttributeView
获取或修改文件的基本属性,包括:
1) 最后修改时间
2) 最后访问时间
3) 创建时间
4) 大小
5) 是否为目录
6) 是否为符号链接等
5.2.3) DosFileAttributeView
获取或修改文件DOS相关信息,比如:
1) 是否只读
2) 是否隐藏
3) 是否为系统文件
4) 是否为存档文件等
5.2.4) FileOwnerAttributeView
获取或修改文件的所有者
5.2.5) FileStoreAttributeView
5.2.6) PosixFileAttributeView
获取后修改POSIX(Portable Operation System Interface of INIX)属性,用于修改:
1) 文件的所有者
2) 组所有者
3) 访问权限信息(即UNIX的chmod命令负责干的事情)
这个View只在UNIX、 Linux等系统上有用
5.2.7) UserDefinedFileAttributeView
可以让开发者为文件设置一些自定义属性
复制代码
2. NIO中的关键技术
0x1: Buffer
Buffer中有几个重要的概念:
1. 容量(capacity): 缓冲区的容量(capacity)表示该Buffer的最大数据容量,即最多可以存储多少数据。缓冲区的容量不可能为负值,创建后不能改变
2. 界限(limit): 第一个不应该被读出、或者写入的缓冲区位置索引。即位于limit后的数据既不可被读、也不可被写
3. 位置(position): 用于指明下一个可以被读出、或者写入的缓冲区位置索引(类似IO流中的记录指针)。当使用Buffer从Channel中读取数据时,position的值等于已经读取了多少数据。
4. Buffer里还支持一个可选的标记(mark,类似于传统IO流中的mark),Buffer允许直接将position定位到该mark处
0 <= mark <= position <= limit <= capacity
Buffer类主要作用就是装入数据、然后输出数据,类中包含几个重要的方法:
复制代码
1. 开始时Buffer的position为0,limit为capacity,程序可以通过put()方法向Buffer中放入一些数据,每放入一些数据,Buffer的position相应地向后移动一些位置(记住,position
是一个记录指针)
2. put()
1) 相对(Relative)写入:
从Buffer的当前position处开始写入数据,然后将位置(position)的值按处理元素的个数增加
2) 绝对(Absotute)写入:
直接根据索引向Buffer中指定位置开始写入数据,但并不影响位置(position)的值
3. get()
1) 相对(Relative)读取:
从Buffer的当前position处开始读取数据,然后将位置(position)的值按处理元素的个数增加
2) 绝对(Absotute)读取:
直接根据索引向Buffer中指定位置开始读取数据,但并不影响位置(position)的值
4. flip()
当Buffer装入数据结束后,调用Buffer的flip()方法,该方法将limit设置为position所在的位置,并将position设置为0(这里要重点注意,相当于将整个Buffer收缩了)。也就是说,
Buffer调用flip()方法之后,Buffer就为输出数据做好了准备
5. clear()
当Buffer输出数据结束后,Buffer调用clear()方法,clear()方法不是清空Buffer的数据,它仅仅将position设置为0,将limit设置为capacity,这样就为再次向Buffer中装入数据
做好了准备(注意,