吴嘉俊(Stef)高级讲师
拥有多年的Java开发经验,CTO,EasyJF开源团队创始人之一、负责
EasyJWeb项目的开发和维护。曾在国内多家大型软件公司负责公司内部框架的开发和维护,为多个大中型公司做过架构和技术咨询。曾组织开发了蓝源
装饰行业ERP、美国EMR、蓝源服装行业连锁管理系统、蓝源SaaS服务平台、蓝源Eloan互联网金融综合解决方案等系统产品。具有非常丰富项目开发和
管理经验。
擅长技术:主流JavaEE,Android技术,对 Spring、JPA、Hibernate、
MyBatis、Struts2、MongoDB、Redis等技术领域有深入研究。
吴老师有丰富的Java培训经验和IT培训行业顾问经验;授课激情,有感染力
,注重对底层原理的剖析和理解;善于培养学生对编程的兴趣;
Java开发的应该如何掌握上述相关技术?
一:首先,有这样的一种情况很常见,对于想自学Java开发的人来说,他们
大多数都是非常盲目的,不知道自己改如何入手,很多人在网上找一些视频,然后疯狂的过视频,很快就把一块内容都学完,他们理解的学完了就是视
频看完了,但是让他们动手去做东西却做不出来,而我的理解学完了就是自己能写出东西,所以对于初学者来说一定不能盲目,要有自己的规划,不然
就是浪费时间白忙活。
二:既然是学习Java开发专业技术,我个人的建议是,一定要有一个能指导
你的人,不能都靠自己闭门造车,这样的行为并不聪明,结识一位这方面的人才,时不时去问问人家问题,不然你可能会发现一个小问题能困扰你一天
,**后还不知道是什么原因。
三:学习Java开发技术,不能跟学数学语文一样对待,比较刚接触代码是不
容易记住的,所以要掌握上述的技术,你还要知道学习Java开发技术有哪些“坑”。对于学习方法这块是尤为重要的,怎么学才能让你学完了能记住之
前学的那些,不至于学完了就忘,这个问题值得你学习之前去思考的。
四:根据我多年的学习情况来看,你平时一定要养成好的学习习惯,就说我
自己吧!我就喜欢把自己曾经遇到的问题整理在电脑的日记本上,然后我会搜集一下博客相关的Java技术文章,一些我认为比较有用的网站,以后都能
用的上,这是我个人的学习习惯,相信我,如果你想走的更远,一定要养成习惯。
**后给大家一些详细的学习安排路线:
Java基础:Java基础语法、数组、类与对象、继承与多态、异常、范型、集
合、流与文件、反射、枚举、自动装箱和注解。
数据库:mysql、oracle
Javaweb:HTML与CSS网页开发基础、Java脚本语言、搭建开发环境、JSP基
本语法、JSP内置对象、JavaBean技术、Servlet技术、Ajax技术
框架:Struts2、Hibernate、Spring、SpringMVC、mybatis
Java设计和编程思想
Java基础
环境搭建(包括Windows下和
Linux下的Java环境搭建)
Java语言基础
Java流程控制
Java常用类
Java面向对象
Java类与对象
介绍面向对象多态
接口与抽象类
Java高级
异常处理
I/O、JavaBean
反射
多线程
网络编程
泛型/Java集合类
Java与数据库
MySQL
ORACLE
JDBC开发与应用
Redis
课程优势
1.行业一线讲师讲解,深入浅出。
2.全面、完善的java课程体系,帮助学员更深更广的体验java魅力。
本阶段学习目标
1.精通java面向对象思想和基础语法。
2.熟练java中异常处理。
3.精通java中I/O操作。
4.掌握java中多线程操作。
5.精通java中集合类的使用。
6.掌握java中网络编程。
7.精通数据库/JDBC/redis/mysql的使用
本阶段学习效果
1.精通Java语言及其高级特性。
2.具备本地应用开发能力,能够开发一些本地软件,例如:聊天室,文件传
输助手等。
IoBuffer
>Mina中传输的所有二进制信息都存放在IoBuffer中,IoBuffer是对java NIO中ByteBuffer的封装(Mina2.0以前版本这个接口也是ByteBuffer),提供了更多操作二进制数据,对象的方法,并且存储空间可以自增长,用起来非常方便;简单理解,它就是个可变长度的byte数组!
IoBuffer常用方法:
1. static IoBuffer allocate(int capacity,boolean useDirectBuffer)
创建IoBuffer实例,**个参数指定初始化容量,第二个参数指定使用直接缓冲区还是Java 内存堆的缓存区,默认为false。
2.IoBuffer setAutoExpand(boolean autoExpand)
这个方法设置IoBuffer 为自动扩展容量,也就是前面所说的长度可变,那么可以看出长度可变这个特性默认是不开启的。
3. IoBuffer flip()
limit=position , position=0,重置mask,为了读取做好准备,一般是结束buf操作,将buf写入输出流时调用;这个必须要调用,否则极有可能
position!=limit,导致position后面没有数据;每次写入数据到输出流时,必须确保position=limit。
4. IoBuffer clear()与IoBuffer reset()
clear:limit=capacity , position=0,重置mark;它是不清空数据,但从头开始存放数据做准备—相当于覆盖老数据。
reset就是清空数据
5. int remaining()与boolean hasRemaining()
这两个方法一般是在调用了flip()后使用的,remaining()是返回
limt-position的值!hasRemaining()则是判断当前是否有数据,返回position < limit的boolean值!
ByteBuffer
缓冲区都有4个属性:capacity、limit、position、mark,并遵循:mark <= position <= limit <= capacity,下表格是对着4个属性的解释:
属性 描述
Capacity
|
容量,即可以容纳的**大数据量;在缓冲区创建时被设定并且不能改变
|
Limit
|
表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的
|
Position
|
位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写作准备
|
Mark
|
标记,调用mark()来设置mark=position,再调用reset()可以让position恢复到标记的位置
|
重要概念
limit(), limit(10)等
|
其中读取和设置这4个属性的方法的命名和jQuery中的val(),val(10)类似,一个负责get,一个负责set
|
reset()
|
把position设置成mark的值,相当于之前做过一个标记,现在要退回到之前标记的地方
|
clear()
|
position = 0;limit = capacity;mark = -1;
有点初始化的味道,但是并不影响底层byte数组的内容
|
flip()
|
limit = position;position = 0;mark = -1;
翻转,也就是让flip之后的position到limit这块区域变成之前的0到position这块,翻转就是将一个处于存数据状态的缓冲区变为一个处于准备取数据的状态
|
rewind()
|
把position设为0,mark设为-1,不改变limit的值
|
remaining()
|
return limit - position;返回limit和position之间相对位置差
|
hasRemaining()
|
return position < limit返回是否还有未读内容
|
IoBuffer 操作
分配一个新的Buffer
IoBuffer 是一个抽象类,所以它不能直接被实例化。分配IoBuffer,我们可以使用两种allocate()方法。
Java代码
// Allocates a new buffer with a specific size, defining its type (direct or heap)
public static IoBuffer allocate(int capacity, boolean direct)
// Allocates a new buffer with a specific size
public static IoBuffer allocate(int capacity)
allocate()方法是用一个或两个参数。**种形式使用两个参数:
capacity - buffer的容量
direct -buffer的类型。
true 意味着得到一个direct buffer,
false 意味着得到一个heap buffer
默认的buffer分配是由SimpleBufferAllocator 处理的。
可选的, 下面的形式也可以使用:
Java代码
IoBuffer buffer = IoBuffer.allocate(8);
buffer.setAutoExpand(true);
buffer.putString("12345678", encoder);
// Add more to this buffer
buffer.put((byte)10);
按照上面的例子,如果数据的长度大于8byte的话,IoBuffe会根据情况重新分配其内置的ByteBuffer,它的容量会被加倍,它的limit会增长到String被写入时的**后position。这种行为与StringBuffer工作的方式十分类似。
注意:这种程序结构在MINA3.0时会被废弃,因为这并不是增长buffer容量的**好方式。这种方式很可能被一种类似InputStream的方式所替代,在InputStream的背后很可能是一组固定长度的ByteBuffers。
创建自动收缩的Buffer
为了节省内存,在有些情形下我们需要释放被额外分配的内存,IoBuffer提供了autoShrink 属性来达到此目的。如果autoShrink属性被打开,当compact()方法被调用时,IoBuffer回将部分的回收其容量,只使用四分之一或是更少的容量。如果需要手动控制收缩行为,请使用shrink()方法。
让我们实践一下:
Java代码
IoBuffer buffer = IoBuffer.allocate(16);
buffer.setAutoShrink(true);
buffer.put((byte)1);
System.out.PRintln("Initial Buffer capacity = " buffer.capacity());
buffer.shrink();
System.out.println("Initial Buffer capacity after shrink = " buffer.capacity());
buffer.capacity(32);
System.out.println("Buffer capacity after incrementing capacity to 32 = " buffer.capacity());
buffer.shrink();
System.out.println("Buffer capacity after shrink= " buffer.capacity());
我们初始化分配一个容量为16的buffer,并将自动收缩设置为true。
让我们看一下输出的结果:
Java代码
Initial Buffer capacity = 16
Initial Buffer capacity after shrink = 16
Buffer capacity after incrementing capacity to 32 = 32
Buffer capacity after shrink= 16
让我们分析一下输出:
初始化buffer的容量为16,因为我们使用16指定了该buffer的容量,16也就成了该buffer的**小容量
调用shrink()方法后,容量仍旧为16,所以无论怎么调用紧缩方法,容量都不好小于其初始容量增加该buffer的容量至32,该buffer的容量达到32调用 shrink()方法,容量回收至16,从而剔除了冗余的容量
再次强调,这种方式是一种默认的行为,我们不需要明确指明一个buffer是否能被收缩。
Buffer分配
IoBufferAllocater负责分配并管理buffer,如果你希望使用你的方式精确控制分配行为,请自己实现IoBufferAllocater 接口。
MINA提供了IoBufferAllocater的两种实现,如下:
SimpleBufferAllocator (默认) - 每次创建一个新的buffer
CachedBufferAllocator - 缓存buffer,使buffer在扩展时可以被重用
注意:在新版本的JVM中,使用cached IoBuffer并不能明显提高性能。
你可以自己实现IoBufferAllocator接口并在IoBuffer上调用setAllocator()方法来指定使用你的实现。
相关推荐:
苏州JAVA培训 苏州JAVA培训班 苏州JAVA培训机构