Java NIO 的一些细节

  最近项目中折腾到Java的新I/O接口,不得不说这个NIO的实现思路还是很不错的,相比传统的阻塞式I/O,NIO具有非阻塞,高效率。通过抽象出通道,缓冲器的概念来与数据打交道,减少了很多步骤,使用更为便捷。NIO支持文件I/O和网络I/O,高效性主要是设计结构更接近操作系统惯用模型。ByteBuffer作为最核心的东西,内容也十分的多,本文也主要问绕这个类来写。

  ByteBuffer继承自Buffer,Buffer中有四个比较关键的字段或者叫索引(mark, position, limit, capacity)。四个值有这样的关系:0 <= mark <= position <= limit <= capacity private int mark = -1;
  标记,设置一个标记位,调用mark()可以将mark的值设置为position。

private int position = 0;
  位置,当前数据起始位置,调用put()添加数据,position会自增。随时保持最新数据的最后一个字节位置。调用position()可以得到当前position值,position(int)可以设置position的值。

private int limit;
  界限,不能使用的数据位,即指向一段数据流末尾。调用get()方法返回的数据就是在position和limit之间的数据。调用limit()可以获取limit值,limit(int)设置limit值。

private int capacity;
  容量,即该Buffer的大小,分配空间时候决定的,一直指向最后一个数据地址。

字节缓冲区的几个重要方法:
allocate(int):新建一个Buffer,分配指定size的空间。此时position = 0,limit = capacity,mark = null,所有元素将初始化为0。

allocateDirect(int):这个功能如上,比较牛的是与系统耦合性较高,因此速度更快,但是分配开支也会增大,数据位于常规垃圾回收管理之外。

get()/get(int):get()获取当前position的值,并且对position做自增,表示移动到下个位置。get(int)只取出指定位置的数据,不移动指针。

put(byte)/put(int, byte):put(byte)在position位置存入byte,对position做自增,移动到下个位置。put(int, byte)替换int指定位置的值为byte,不移动指针。

flip():在准备取缓冲区内所有数据的时候必须调用一次,进行这些操作:limit = position,position = 0,mark = -1,意味着之前标记将丢失,从0到limit进行遍历即可得到所有数据,写入也时同样的道理。

mark():对缓冲区的位置做标记,进行这个操作:mark = position。一般会配合reset()来使用,前者将当前位置记住,后者将当前位置设置为记住的位置,这有点像录音机中的A-B复读的意思。对于需要取一段特殊数据是有用的。

reset():重置缓冲区的position为先前mark的位置,进行这个操作:position = mark。如果mark < 0会抛InvalidMarkException异常,也就是没有调用mark()之前,不可以reset。 clear():重置缓冲区指针,进行这些操作:position = 0,limit = capacity,mark = -1。这个操作并不会删除实际的数据,但是指针位置被重置了,和flip()接近。

limit()/limit(int):分别是获取limit和设置limit。需要注意的是设置的时候不能超过capacity,不能小于0,如果position > limit,会将position也设置为limit,相当于缩小了范围。如果mark > limit,则mark = -1,作废。

position()/position(int):分别是获取和设置position,设置的时候不得大于limit,不得小于0,如果mark > position,则mark = -1,作废。

rewind():重绕缓冲区,进行这些操作:position = 0,mark = -1。可见也是类似flip(),可以为存取数据做准备,并且使mark作废。

remaining()/hasRemaining():前者得到剩余数,即position – limit的值。后者是判断position是否小于limit,小于返回true,可以用在取数据时判断是否还有数据。

  等等,还有些就不一一介绍了。

冬日暖阳

  Aperture还是蛮好用的,导入导出,调色,用的及其顺手。居然发现有人把Instagram的滤镜都搬到Aperture中了,太喜爱了~~

  拍摄于东湖公园11月菊花展,主要是找了些逆光的角度拍的。一直比较喜欢佳能的逆光色彩,再加上小痰盂毫无可言的抗光晕,于是就有了下面的图。。

  更多照片可以在我的Flickr看到。

IMG_2983IMG_2985IMG_2989 继续阅读冬日暖阳

此刻如此安静 XBA-C10试听

  本来是在XBA-10和XBA-20之间纠结了点时间。10采用单单元动铁,20是双单元动铁,一个全频和一个低音提升单元,价格也飙升一倍之多。最后发现还有更入门的XBA-C10,和XBA-10主要是外观不同,还少了带海绵噪音隔离的耳套,正巧JD降价优惠,果断入手。

  至于说动铁和动圈孰优孰略,这个就讨论不清了,不过可以肯定的是动铁单元是可以做到耳塞全密封。

  算算应该是第三个Sony耳塞了,对于入耳式耳塞,我一直比较喜欢Sony,主要是低音效果好。后来手机换iPhone后为了线控,又选择了苹果Earpods,由于近段时间来下班比较早,高峰期坐公交堵在路上的时间又多了起来,加之一直以来有听Podcast的习惯,由于环境嘈杂,使用苹果耳机会不自觉开大音量,音量在iPhone上大概要开到倒数两三格,感觉比较损伤听力。于是决定入手一个隔音强的耳机。

  音质什么的就感觉就还一般般了,高音比较清晰。低音也似乎还没同价位的动圈强。完全不是XBA系列宣传的那么好。莫非这是要忽悠着升级到四单元动铁XBA-40的节奏,呵。

  当然,重点还是在隔音上,戴上后会觉得世界从未有过如此的安静,安静到只听得到心跳,走在人群中仿佛在看一场无声电影。现在音量只需要四到五格即可,足足少了三分之二。

  XBA系列都有带线控的版本,个人觉得很没必要,由于隔音缘故,自己说话的声音都会通过骨传导到耳朵,听着很别扭。所以,大幅度的运动也不适合戴。

  附参考官方介绍链接

MAC之道,化繁为简

  逐渐将开发环境迁移到OS X系统上来,都还顺利,也没什么不兼容的软件。OS X是一个很简单的系统,一个Unix内核,一个GUI图形界面。像及了多年以前用的Linux内核和Gnome桌面组合。选两点话题来吐槽下。

文件浏览
  OS X中的文件浏览器是Finder,默认也只显示了特定的几个文件夹:应用程序,桌面,文档,下载,音乐,图片等等,分门别类清晰明了。10.9新增的tags系统也很实用,常写博客的对tag肯定不会陌生,识别一个颜色标签总比记路径强吧。对应Windows操作系统的文件浏览器就是Explorer,桌面上的“这台电脑”,这个工具自Windows 95以来越来越复杂,功能越来越多。虽然微软自己弄了一套叫Ribbon的界面,将复杂的功能也归类了。在这个越来越缺乏耐心的时代,付出的学习成本还真是不少。

系统设置
  系统设置是一个很少用,但在初装的系统上总得设置一番的地方。可调节的总数基本上决定这个系统的复杂程度。我真怀疑Windows下的控制面板是否能从第一个设置依次遍历完整。当然,谁会无聊去点这玩意。反正我操作最多的是禁用一些不必要的服务项,这大概是从XP时代留下来的习惯,由于当时系统配置并不是很高。自从某年内存白菜价的时候一口气将笔记本的2G内存升级到8G,就再没优化过系统了。而现在重装个系统恐怕都不想花这个时间了,更别说优化。

  简约,优雅,极速,正如奥林匹克精神一般,更快更高更强。