`
airu
  • 浏览: 270736 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论
文章列表

Java-NIO-Selector

Selector 的出现,大大改善了多个 Java Socket的效率。在没有NIO的时候,轮询多个socket是通过read阻塞来完成,即使是非阻塞模式,我们在轮询socket是否就绪的时候依然需要使用系统调用。而Selector的出现,把就绪选择交给了操作系统(我们熟知的selec函数),把就绪判断和读取数据分开,不仅性能上大有改善,而且使得代码上更加清晰。 Java NIO的选择器部分,实际上有三个重要的类。 1,Selector 选择器,完成主要的选择功能。select(), 并保存有注册到他上面的通道集合。 2,SelectableChannel 可被注册到Selector上的通道。 ...
...文件映射有个需要注意的问题,就是你无法确保他被释放了。 也就是只有映射的内存被回收,文件才会被释放。否则其他进程访问就是被锁状态。 所以这个对于一个进程一个文件。如果多个进程访问一个文件,还是不是很适合。 最近看了文件内存映射。在NIO中,使用起来很方便。 文件通过内存映射以后,访问速度自然是提高了。 当然也有很多问题,现在我们来看看NIO中的内存映射文件。 public abstract class FileChannel extends AbstractChannel implements ByteChannel, GatheringByteChannel, Scatter ...

JavaNIO-文件通道

文件通道,是一种特殊的通道。 对于文件通道来说,是不能阻塞的。所以并不能设置非阻塞模式。 对于异步文件I/O来说,这是很多操作系统支持的,NIO也会增强。 一个FileChannel只能从RandomAccessFile,FileInputStream和FileOutputStream来获取(getChannel),然后你就获得了某种能力,请看: package java.nio.channels; public abstract class FileChannel extends AbstractChannel implements ByteChannel, GatheringByt ...

JavaNIO-通道

Channel 这里的Channel接口很细。一个Channel能做什么呢? package java.nio.channels; public interface Channel { public boolean isOpen( ); public void close( ) throws IOException; } 很简单吧。这个也太抽象了。通道就是这样。其实和我们看到的管道一样。可以关闭,可以问,这个管道通不通? 当然,最主要的还是我们如何使用呢?读和写永远是两个孪生操作。 对一个管道的字节读,有 ReadableByteChannel, WritableByte ...
上一篇讲了基本的缓冲区概念,以及NIO的缓冲区属性以及部分操作。 现在让我们在看看缓冲区的一些细节。 1、缓冲区的创建 之前也许你已经看到了。我们使用alocate方法创建一个缓冲区。下面是一个创建方法集合。 public abstract class CharBuffer extends Buffer implements CharSequence, Comparable { // This is a partial API listing public static CharBuffer allocate(int capacity); public static CharBuf ...
NIO中,有自己设计的一套缓冲区系统。 使用I/O,离不开缓冲区,高效的缓冲区,往往起到事半功倍的效果。 下面就看看NIO中的缓冲区是如何设计的。 首先,我们是针对概念来说明缓冲区的属性。缓冲区的四个属性: 1、容量(Ca ...

一个面试题

这个题目估计类似一些比赛用的题目。 现在先说一个。 说是有篮子,可以装球,篮子有一定的容量。问题是,给定篮子数量,篮子容量,还有小球数,求出有几种装法。(原文是英文的) 这里还有些限制,比如篮子数不会多余5个,小球不多于50个等。 例子: 篮子数 容量 小球数 2 5 2 结果: 3 也就是 (0,2),(2,0),(1,1)这三种组合 2 5 11 结果 0 这说明篮子不够装下那么多小球。 相信大家现在应该知道题意了。那么我们就开始算法吧。 我首相想到,这种排列组合的算法,使用循环来做。 那么,仔细一看,发现,有几个篮子,我们就要做几个大循环。每个循环里面,再通过尝试增加小球数,然后计算是 ...
北京越来越热了,赶到东直门的时候绕了半天路,终于到了。正好准备一间房间做传说中的结对编程。我一看上面写着“元”,顿感不爽(最近在看宋史)。桌子上有两套鼠标键盘,两个显示器,一个是戴尔笔记本的显示器,一个是台式机的显示器。 然后HR很又好的倒好水,说一会儿有两个人来面试,一个作为结对的伙伴,一个算“监军”吧。 然后来了两个小伙子。问我习惯用台式机键盘还是笔记本键盘,我说随便吧,他说你还是自己选习惯的吧。我就顺手拿了台式机键盘。然后他们说他们习惯用IDEA,而不是Eclipse,就用IDEA把工程导入了。接着监军说,他没看过我的代码,让我说说。我就讲了下主要的地方。他说还是比较搞不清,让我画了图, ...
在学习策略模式的时候,我有点迷茫了,因为他和简单工厂模式很像。 这里的Context不就是工厂吗? 对,如果只是从图上看确实一样。但是,我们会发现,他们的侧重点不一样。 也就是意图不一样。策略模式,主要是用来封装一个场景下的不同的算法,通过接口隔离 具体的算法,我们可以对这些算法进行单独测试,并且在Context中替换使用。 再来看简单工厂模式,也是封装了不同的类,但是他的重点在创建,这些具体的产品类是不可以被替换的。 好了,说了那么多,或许我们还是很晕。那就看看Comparator 接口吧。如果你使用了一些集合类,然后需要排序那么你一定要知道如何比较这些集合中的对象吧。 于是,比较算 ...
接上一篇。这里到了比较关键的时候了。 Kent跨大步了,但是如何找到合适的步伐,还是需要不断从小步尝试。 现在看看目前的to-do lists吧。 5美元 + 5美元 = 10 美元 5美元 + 10法郎 = 10 美元 假设美元对法兰的汇率是 1:2 这里要注意的是两件事,首先,加法的引入,然后,汇率实现。 我们需要快速在脑子里浮现出一个场景。我们去银行兑换货币,银行提供汇率…… 这里,先实现一个简单的加法测试 @Test public void testSimpleAddition(){ Money sum = Money.dollar(5).plus(Mone ...
上一次讲到了私有化amount,并且,重写了equals方法,对于hashCode方法(假设返回0,这样退化到线性查找,但是暂且不影响我们的正确性),我们暂且放下。我们现在还是看看to-do lists 5美元 * 2 = 10 美元 5美元 等于 5美元 5美元不等于6美元 私有化amount 5法郎 * 2= 10 法郎 5法郎 等于 5法郎 5法郎 不等于 5法郎 5美元 不等于 5法郎 上面是引入新的货币,法郎,我们发现其实和美元很相像。于是,我们创建和美元一样的测试,然后把美元的代码copy过来,修改成法郎。 上面的动作,或者就是大家工作中的真实写照了吧。不过不要着急,我们的测 ...
以前看过《TDD by example》,现在基本都忘记光了,大致记得一切从测试开始,然后不断重构,最后不断的迭代就能得到一个优雅简洁的设计。 关于TDD的很多讨论,我这里就不说了。对于写了那么多年代码的人来说,要想转变观念,还是需要更加冷静,多思考。 TDD 中 kent Beck大师教给我们的是一门内功心法,交给我们的是如何把预想的结果转化为设计。 TDD = Test-Driven Development 很多人以为是讲测试的,其实醉翁之意不在测试,而是开发,如何使代码clean "TDD by example”这本书的风格我很喜欢,直接从例子开始,让然一看就被吸引住。 书中 ...
工厂模式,属于创建型模式,我们不在自己创建对象,而是交由工厂来创建。 这样的好处是,我们使用工厂来封装对对象的需求,否则,你可能写一大堆if else来判断,然后新增一个对象的话,又得改这段代码。 简单的工厂模式 ...
GOF的设计模式,讲的很细,我这里都很粗略。什么意图,别名,参与者,结构,协作,效果等等。。。 我这等小民,也没有那么高深的理论,拾人牙慧就满足了。 模式是死的,运用是活的。 今天讲讲装饰器模式。其实 每个模式的名字都很重要,因为这个名字基本就说明了这个模式用来干什么。当然,装饰器,不是用来装饰的,但是和装饰相关。 比如,我们设计一个窗子,完了,觉得太单调,于是重新加上边框,还觉得单调,那就贴点窗纸吧,如果还是不满意,那么可以糊个纱窗…… 如果用程序来实现,我们可能想到这些对象,窗子,加边框的窗子,贴窗纸的窗子(好拗口),加边框贴窗纸的窗子…… 其实这种错误只会在初学者身上犯。 首先,我 ...
今天这个模式,也是面试的时候问到的。其实这个模式最好理解。 观察者,与被观察的物体,订阅者,与被订阅(发布)者。 着这个模式下,我们实现了一对多的一个机制,并且可以针对对感兴趣的事情做订阅,或者观察,一旦有内容就自动通知。生活中这样的例子太多。在java中,也自带这个模式。我们还是先看看这个模式的UML: 一个订阅,一个发布,实际上很清晰明了。现在举个例子吧。天气预报吧。 每天都有气象局发布天气预报,而我们总不能天天打电话问吧,那就好好订阅一个天气服务吧,他会自动给你报。 首先,定义一个可被观察的对象。Oberservable,天气是可以被观察的吧。 public interf ...
Global site tag (gtag.js) - Google Analytics