尝试了Socket的一般实现,同步处理,没什么问题了。
另外发现调用Socket的时候,经常Socket就调用getOutputStream()取出OutputStream输出流,然后写么,一般都习惯性的写点内容,然后flush()。突然发现。。好像一直不知道这个flush的作用,就百度了下,发现有人说这个没用,我就自己试了试,看了下jdk的源码。在调用Socket的时候,这里取出的OutputStream应该是SocketOutputStream,这个东西没有覆盖父类的flush方法,那么往上看是FileOutputStream,再往上是abstract的OutputStream,这里边的flush是空方法,SO,确实是没有什么实际作用的。
然后优快云论坛上之前有个哥们说好多OutPutStream的子类中的flush也没用,于是也就顺便看了下,DataOutPutStream中的flush是子类重写过的,调用的是他内部成员OutputStream的flush(),而这个成员out,又和DataOutPutStream构造的时候有关,SO,如果构造的时候用的那个OutPutStream中flush就是没用的,那这个buffered也就没啥用了,比如说用FileOutputStream去构造。具体用flush有意义的,一般都是那种涉及到利用缓冲区的,我CTRL+T了下,比如BufferedOutPutStream, PipedOutputStream,ObjectOutputStream的flush就是有用的。
然后在写测试类的时候无意中查到个东西,就也具体的看了看。。就是Iterator这个玩意,以前不太喜欢用,后来尝试多模匹配AC算法实现的的时候,搞了段代码,里头重写了一个集合的iterator()方法。我以前遍历集合,喜欢用for(T t : 集合),顶多了,有时候的情况是,遍历某个集合,去掉不满足条件的。。。我之前就尝试遍历过程中,list.remove然后报异常了。。。遍历过程中修改集合。。。所以我过去的方法特土鳖。。都是把不满足的东西放到另一个list里头,然后遍历完了,removeAll。。。这次正好又学到了这个,用iterator,for(; it.hasNext(); it.next()) 注意这个it.next()如果在循环体中调了的话,就别写for里头了。这样如果这个遍历的对象不满足条件的话,用it.remove()是不会有影响的,很nice。it.next()给我的感觉,就像是,有10条记录的集合,遍历第一圈, it没指向谁,然后以一执行it.next,it指向第一个,并返回第一个,这个时候,remove是remove掉第一个元素,假如你上来就it.remove的话,it没指向谁,就该报错了。
此外,我也试了下,for(T t:集合)循环过程中,用it.remove。也是会报错的。然后用iterator遍历过程中,用list.remove也会异常,所以涉及到遍历集合过程中修改集合的话,还是用iterator遍历+修改,比较稳.
今儿打算一看下Socket异步处理的那堆代码,我才发现那个包是java.nio。。。我日,没用过,另外昨儿回家的路上看jsp的电子书。。。上来讲javabean用了一些propertychange一类的处理,监听。我觉得这个可能前台用的比较多吧,以前我是用winform做界面的,里边对监听啊,事件啊,用的比较多,而且那会oracle也表示不用swing什么的了么。。就没学,不过看来还是有用的,今天有空也写写看。