第七讲输入输出流课稿.ppt
文本预览下载声明
* java.nio的功能的性能优势 能够直接从硬盘上、而不需要一字节一字节地读写数据块 当你在非阅读期间将数据从缓冲器中提出时,它处理低字节优先问题。 可以进行非阻塞异步输入/输出 你能够锁定整个或部分文件 * NIO四个关键的抽象数据类型 Buffer:它是包含数据并且用于读写的线性表结构,其中提供了一些特殊类用的内存映射文件的IO操作 Charset:它提供了Unicode字符串影射到字节序列以及逆影射的操作 Channels:包含了socket、file和pipe三种通道,实际上是双向交流的通道。 Selector:它将多元异步IO操作几种到一个或者多个线程中 * 内存映射文件 IO中读写数据的方法,它可以比常规的基于流或者基于通道的IO高效很多,内存映射文件IO的读写方式是通过使用文件中的数据组合成为内存数组的内容来完成的 在读写过程中只有真正在读写的部分才会进入内存,这种方式称为映射。现在很多操作系统一般都会根据需要将文件或者文件中的某些部分映射为内存的一部分内容,从而实现文件系统,Java内存映射机制不过使用的是针对底层操作系统的该机制的一种使用。 * 缓冲区结构 一个绝对不会改变的缓冲区的容量capacity 下一个值的读写位置position 无意义读写的一个限制空间limit 额外的还有一个用来重复读写的标记mark 缓冲区结构 * 使用映射文件来读取文本文件 public class?NativeMapFile { ?? ?public static void?main(String?args[]){ ?? ??? ?FileInputStream fileInputStream; ?? ??? ?FileChannel fileChannel; ?? ??? ?long?fileSize; ?? ??? ?MappedByteBuffer mBuffer; ?? ??? ?try{ ?? ??? ??? ?fileInputStream =?new?FileInputStream(test.txt); ?? ??? ??? ?fileChannel = fileInputStream.getChannel(); ?? ??? ??? ?fileSize = fileChannel.size(); ?? ??? ??? ?mBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileSize); ?? ??? ??? ?for(?int?i = 0; i fileSize; i++ ){ ?? ??? ??? ??? ?System.out.print((char)mBuffer.get()); ?? ??? ??? ?} ?? ??? ??? ?fileChannel.close(); ?? ??? ??? ?fileInputStream.close(); ?? ??? ?}catch(IOException ex){ ?? ??? ??? ?ex.printStackTrace(); ?? ??? ?} ?? ?}?? ? } * FileChannel? 用于读取、写入、映射和操作文件的通道,文件通道在文件内部有一个当前的position,可以对其进行查询和修改 ,除了字节通道中常见的读取、写入和关闭操作,此类还定义了下列特定于文件的操作: 以不影响通道当前位置的方式,对文件中绝对位置的字节进行读取和写入 将文件中的某个区域直接映射到内容中,对于较大的文件,这通常比调用普通的read或write方式更加高效 强制对底层存储设备进行文件更新,以确保在系统崩溃的时候不丢失数据 以一种可以被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到某个其他通道中,反之亦然 可以锁定某个文件区域,以阻止其他程序进行访问 ?FileInputStream、FileOutputStream 或 RandomAccessFile?对象调用该对象的 getChannel 方法,这会获得一个连接到相同底层文件的文件通道 * ByteBuffer 该类针对字节进行了六种操作: 读写单个字节的绝对和相对get和put方法 将此缓冲区的连续字节列传输到数组中的相对批量get方法 将byte数组或其他字节缓冲区中的连续字节序列传输到此缓冲区的相对批量put方法 读写其他基本类型值,并按照特定的字节序列在字节序列之间转换这些值的get和put方法 创建视图缓冲区的方法,这些方法允许将字节缓冲区视为包含其他基本类型值的缓冲区 对字节缓冲区进行compacting、duplicat
显示全部