2016-2017-2 《Java程序设计》第X周学习总结

##认识NIO

在java中,输入与输出,基本上是以字节为单位进行的低层次处理,实际上多半是对字节数组中整个区块进行处理,对于dump()方法,必须处理byte[] ,必须指定写出的byte[]的起点和字节数。例如

Java..io套件中有一些装饰类,例如DataInputStream,dataOutputStream,BufferedReader与Bufferedwriter等,若只要对字节或字符串中感兴趣的数据区块进行标记,像是标记读取位置、数据有效位置,对于这些区块标记,提供了clear()、rewind()、flip()、compact()等高级操作,对于上面的dump()方法,若使用NIO的话,可以如下撰写:

现阶段可了解在程序示范中,只要确认将数据从Channel中读入Buffer(read()方法不返回-1),使用高级flip()方法标记Buffer中读入Buffer中读入的数据写到另一个Channel,最后使用clear()方法清除Buffer标记,在这个过程中,不用接触byte[]相关细节。

Channel架构与操作

NOI中Channel的相关接口与类,是位于java.nio.channle套件之中,Channel接口是AutoCloseable的子接口,因此都可以使用尝试关闭资源语法,channel接口上主要新增isopen()的方法。

ReadableByteChannel定义了read()方法,负责将ReadableByteChannel中的数据读取至ByteBuffer,writeableByteChannel定义了write()方法,负责将ByteBuffer的数据写到writeableByteChannel中,ScatteringByteChannel定义了read()方法,可以讲ScatteringByteChannel分配到ByteBuffer数组中,GatheringByteChannel定义的write()方法可以将ByteBuffer数组的数据写到GatheringByteChannel。

WriteableByteChannel的行为,ByteChannel的字接口SeekableByteChannel可以读取改变下一个要读取存储的位置。

Buffer的架构与操作

在NOI设计中,数据都在java。Nio.Buffer中的处理,Buffer是个抽象类,定义了clear()、flip()、reset()、rewind()等对数据区块的高级操作,这类操作返回类型都是Buffer,实际上返回this,因此在需要连续高级操作时,可以形成管线操作风格。

根据不同的数据处理类型需求,可以选择不同的·Buffer子类,他们都是抽象类,因此不 能直接实例化,然而Buffer的直接子类们都有一个allocate()的静态方法,让指定的Buffe容量,如果是ByteBuffer,容量是指内部操作时使用的byte[]长度,如果是FloatBuffer,容量是指Float[]长度,以此类推,Buffer容量大小可以使用capacity()方法取得,如果想使用Buffer内部的数组,可以使用array()的方法,如果有一个个数组想要转换为某个Buffer子类实例时,每个Buffer()子类实例都有warp()静态方法提供这个服务。

如果使用ByteBuffer,还有一个allocateDirect()方法,相对于allocate()方法配置的内存有JVM管理,allocateDirect()会利用操作系统的原生I/O操作,试着避免JVM的中介转接,理论上会比allocate()配置的内存更为有效,但是allocateDirect()的配置内存时会消耗较多系统资源,故建议只用在大型、存货长的ByteBuffer对象,并能观察除明显的功能差异的场合,通过isdirect()得知。

Buffer是个容器,填装的数据不会超过他的容量,实际读取或写入的数据界限索引值可以由limit()方法得知或限定。

Bufffer的操作可以先从clear(),flip(),与rewind()开始认识,当一个缓冲区刚被配置或调用clear方法后,limit()等于capacity(),position()会是0,。

以下是一个使用flip()完整的范例

Buffer上还有个mark()方法,可以在目前position上标记,存取buffer之后,若调用reset()方法,会将position设回被mark()标记的位置。Position与limit之间为剩余可存取的资料,可以使用remaining()方法得知还有多少长度,使用hasReamming()可以测试是否还有剩余可存取的数据。

NIO2的架构

应用程序开发者主要使用java.nio.flie与java.nio.file.attribute,包中必须操作的抽象类或接口,由文件系统提供者操作,应用程序无需担心底层如何实际存取文件系统,通常只有文件系统才需关心java.nio.file.spi包。

NIO2文件系统的中心是java.nio.file.spi.FileSystemProvider,本身为抽象类.,是文件系统提供者才能操作的类,作用是产生java.nio.file与java.nio.file.attribute中的各种抽象类或接口的操作对象。

对学习者而言,只要知道有FileSystemProvider的存在即可,我们可以通过java.nio.file包中FileSystem、paths、files、等类提供的静态方法,取得相关操作对象或进行各种文件系统的操作,这些静态方法内部会运用FileSystemProvider来取得所需的操作对象,完成操作。

要操作文档,先要指出文档路径。Path实例是在JVM中路径的代表对象,也是NIO2文件系统API操作的起点,NIO2文件系统API中有许多操作,都必须使用Path指定路径。

想要取得path实例,可以使用Paths.get方法,最基本的使用方式,就是使用字符串路径,可使用相对路径或绝对路径,例如:

Path workspace = Paths.get(“C:\\workspace”);

Path books = Paths.get(“Desktop\\books);

Path path = Path.get(args[0]);

Paths.get()的第二个参数开始接受不定长度的自变量,因此可以指定路径,之后的路径分段指定。例如以下指定用户目录下的Documents\Downloads:

Paths实例仅代表路径信息,该路径实际上对应的文档或文件夹不一定存在。Path提供一些方法取得路径的各种信息,例如:

路径元素以文件夹为单位,最上层索引为0。

Paths操作了Iterable接口,若要循序渐进取得Path中分段的路径信息,也可以使用增强式for循环语法或forBath()方法,例如:

Path.path =  Path.get(System.getProperty(“users.home),””Documents”,”Documents”);

Path.forEach(out::println);

路径中有冗余信息,可以使用normorlize。

读取访问目录

如果想要取得文件系统根目录路径信息,可以使用FileSyatem的getRootDirectories()方法,这会返回Iterabe<String>对象,可用增强式for或循环或新增的forEach()方取得根目录的路径信息,例如:

也可以使用Files.newDirectoryStream()方法取得DirectoryStream接口操作对象,代表路径下的所有文档。

这个范例可以从命令行自变量指定目录路径,查询该目录下的文档:

尽量简单的总结一下本周学习内容

尽量不要抄书,浪费时间

看懂就过,看不懂,学习有心得的记一下

## [代码托管](码云学习项目链接)

http://git.oschina.net/tianmaxingkomg/xinjianxianmu

(statistics.sh脚本的运行结果截图)

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:[软件工程软件的估计为什么这么难](http://www.cnblogs.com/xinz/archive/2011/04/05/2005978.html),[软件工程 估计方法](http://www.cnblogs.com/xinz/archive/2011/04/06/2007294.html)

- 计划学习时间:14小时

- 实际学习时间:16小时

- 改进情况:

(有空多看看[现代软件工程 课件

软件工程师能力自我评价表](http://www.cnblogs.com/xinz/p/3852177.html))

## 参考资料


[Java学习笔记(第8版)](http://book.douban.com/subject/26371167/)

-  [《Java学习笔记(第8版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)


...

20155335俞昆 《java程序设计》第八周总结的更多相关文章

  1. 201521123027 <java程序设计>第八周学习总结

    1.本周学习总结 1.1思维导图 2.书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 总结:判断List中是否存在指定元素,需要用到equals方法,若存在就用remove进 ...

  2. 20155335俞昆《Java程序设计》第五周总结

    #  20155335    <Java程序设计>第五周学习总结 ##  教材学习内容总结 ##  教材学习中的问题和解决过程 对于异常处理,程序中总有意想不到的状况所引发的的错误,Jav ...

  3. 20155335俞昆《java程序设计》第三周总结

    20155335  2006-2007-2  <Java程序设计>第三周学习总结 ##  教材学习内容总结 首先,关键是区基本类型和类类型,,产生对象必须定义类,类是一个概念,并不存在,对 ...

  4. 20155335 俞昆 2016-2017-2 《Java程序设计》第九周学习总结

    学号 2016-2017-2 <Java程序设计>第九周学习总结 ##JDBC入门 在正式介绍JDBC前,已知JDBC是用来执行SQL的解决方案,开发人员使用JDBC的标准接口,开发人员不 ...

  5. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

  6. 201871010106-丁宣元 《面向对象程序设计(java)》第八周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第八周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...

  7. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  8. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  9. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  10. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

随机推荐

  1. ubuntu iftop工具安装和参数

    安装iftop有很多依赖关系: sudo apt-get install flex bison wget http://www.tcpdump.org/release/libpcap-1.5.3.ta ...

  2. CAP定理与BASE理论

    1. CAP定理 C:Consistency,一致性 A:Availability,可用性 P:Partition tolerance,分区容错性 CAP定理,指的是在一个分布式系统中,一致性.可用性 ...

  3. Java之"instanceof"和"isInstance"代码举例

    源码: /** * @Date:2018-04-20 * @Description:判断Instance * - instanceof方法返回一个boolean类型的值,意在告诉我们对象是不是某个特定 ...

  4. Lodop代码设置打印机等信息后 设置预览可重选

    Lodop打印控件默认在代码里指定了打印.纸张.纸张方向.份数等信息,在预览的界面的设置里是无法重新选择的,默认是禁止重选的,如果重选会提示,例如:“打印方向”已由程序控制,无法改变!“纸张大小”已由 ...

  5. BZOJ3834[Poi2014]Solar Panels——分块

    题目描述 Having decided to invest in renewable energy, Byteasar started a solar panels factory. It appea ...

  6. ef group 封装

    表达式树,传递 group public class Test<T> where T : class { MoviesEntities db = new MoviesEntities(); ...

  7. 详解HTTP协议

    一 什么是HTTP协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议.HTTP 是基于 TCP/ ...

  8. POI插入图片至Excel使用固定的长宽

    使用POI在Excel里插入图片,如何使插入的图片使用固定的大小?先介绍原有的两种方式: 一种是指定开始和结尾单元格,然后从头画到尾,相当于平铺 还有一种就是仅指定开始的单元格,图片的大小跟这个单元格 ...

  9. day23 模块引入的一些说明

    模块导入多次也是只导入一次 sys.modules里面会查看有没有被导入 导入后的模块内部的函数,变量就都可以拿来用了 给模块起别名,可以提高代码的兼容性 import time as t 但是被起别 ...

  10. 自学Linux Shell7.1-linux用户账户和组

    点击返回 自学Linux命令行与Shell脚本之路 7.1-linux用户账户和组 linux安全系统的核心是用户账户.每个能进入linux系统的用户都会被分配唯一的用户账户,用户对系统中各对象的访问 ...