日常——异步Socket实现中的问题

本文探讨了Socket编程中OutputStream的flush方法的实际作用,并通过源码分析揭示其在不同子类中的有效性。同时,介绍了如何使用Iterator进行集合遍历及元素移除的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

尝试了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什么的了么。。就没学,不过看来还是有用的,今天有空也写写看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值