作者Killercat (杀人猫™)
看板AndroidDev
标题Re: [问题] 有关socket inputstream和outputstream的问题
时间Thu Mar 15 21:00:43 2012
我发现我忘了写应对这种东西的workaround了...
事实上当你写server的时候,很多时候你是没得选择的。
根据我自己的经验,会犯下这种错误的coder其实比率是相当高的
只是绝大多数都是在windows下作业跟跑server,有时候是一些3rd party
server来讲你很难做些什麽。毕竟code不是你写的,你也没source code
你更没办法把写client的人抓过楼狗干一顿(我个人是称为「友善的争论」XD)
既然改不了client,那我们只好改server,让server吃得下这些错误的东西
在谈让server怎麽吃这些东西而不至於拉肚子以前,我先讲个瘟腥小故事
IE7以前的世界,事实上browser是非常「友善」的
友善到一些明明是错的东西他照样吃
比方说<p>没</p>,<body><p>...</body></p>照吃不误
这样其实大家写code都很开心,问题是每个browser都用不一样的方法去解译它
所以造成了同一组code的效果不见得一样。
这造成了html界的大混乱,也间接导致了严格规范的xhtml诞生。
(不过这东西始终没有来的及正式长大,就被html 5.0取代了)
请注意,我们现在做的事情就跟以前「友善的」server一样,是不对的
但是这是一种没办法中的办法
说穿了很简单,我们改用一个字元一个字元的去读它(没buffer想必这会很耗力)
当我们读取到\r的时候,我们会打开一个flag, 然後将\r後面多写一个\n
下一个如果是\n的时候我们就把flag关闭并且跳过这个\n,不是的话关闭flag继续
具体的code大约是这样(我个人是用filterinputstream处理这种东西)
boolean LRFlag = false;
while(char input = in.read()) {
if(input == '\r') {
LRFlag = true;
out.write(input);
out.write('\n');
continue;
}
if(input == '\n' && flag == true) {
flag = false;
continue;
}
flag = false;
out.write(input);
}
继承fliterinputstream在read里面插入这一段(也有一种写法是override skip(),
方法大同小异,我是比较喜欢override skip()就是,不过这比较少为人知)
hope it helps
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.167.139.229
1F:→ Killercat:没版主的板要赚个P都没得赚 两篇都是 悲凄 XD 03/15 21:01
2F:推 Ting1024:有看有推 XDDDD 03/15 22:07
3F:推 nfsong: 推 03/17 11:54