ReplayingDecoder 和ByteToMessageDecoder 最大的不同就是ReplayingDecoder 允许你实现decode()和decodeLast()就像所有的字节已经接收到一样,不需要判断可用的字节,举例,下面的ByteToMessageDecoder 实现:
public class IntegerHeaderFrameDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List<Object> out) throws Exception { if (buf.readableBytes() < 4) { return; } buf.markReaderIndex(); int length = buf.readInt(); if (buf.readableBytes() < length) { buf.resetReaderIndex(); return; } out.add(buf.readBytes(length)); } }
首先来看一下List接口中的sort()
方法
从这个描述我们可以看到,我们可以根据具体的Comparator对List结合中的元素进行排序,如果传入的comparator是null的时候,那么集合中的元素必须实现Comparable接口实现自然排序。从上面的一段话我们知道List集合对元素排序的方法有以下两种:
- List中的元素自己实现一个Comparable接口实现一个自然排序
- 我们通过传入一个实现了Comparator接口实现一个排序
Java正则表达式:
- (?i)abc 表示abc都忽略大小写
- a(?i)bc 表示bc忽略大小写
- a((?i)b)c 表示只有b忽略大小写
也可以用 Pattern.compile(rexp, Pattern.CASE_INSENSITIVE) 表示整体都忽略大小写
// 高效率访问方式
Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); }
File 类的介绍:/article/.html...
Java IO 流的分类介绍:/article/.html...
这篇讲的是字节输入输出流:InputStream、OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam、FileOutStream)
模拟表单html如下:
<form action="up_result.jsp" method="post" enctype="multipart/form-data" name="form1" id="form1"> <input type="text" name="name" value="" /> <br/> <input type="file" name="userfile" /> <br/> <input type="submit" value="上传" /> </form>
@PostConstruct
注解好多人以为是Spring提供的,其实是Java自己的注解。从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct
和@PreDestroy
,这两个注解被用来修饰一个非静态的void()方法。