仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1379|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网站制作之“给你第二次时机”――小议PushbackIn...

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:48:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
主要缺点就是:速度比较慢,没有C和C++快streamjungleford如是说
PushbackInputStream和PushbackReader是JavaI/O体系里两个对照让人利诱的类,我之前对它(们)就不太懂得,直到某一天看了之前水母Java版的牛人zms的批评和一些材料今后才有所获益。这是几个月之前的事变了,这几天写有关序列化的总结时才想到这也不掉为一个好的话题。

一个同意你忏悔的hook

JavaI/O体系是一个典范的Decorator形式的完成,它以InputStream/OutputStream为基础中心,经由过程承继干系,不休为该中心增加新的功效,如文件流、缓冲、加解密等。对I/O体系计划形式感乐趣的话,能够参考developerWorks上的一篇文章:从Java类库看计划形式。JavaI/O默许是不缓冲流的,所谓“缓冲”就是先把从流中失掉的一块字节序列暂存在一个被称为buffer的外部字节数组里,然后你能够一会儿取到这一整块的字节数据,没有缓冲的流只能一个字节一个字节读,效力孰高孰低一览无余。有两个特别的输出流完成了缓冲功效,一个是我们经常使用的BufferedInputStream,像读文件我们经常使用
BufferedInputStreamin=newBufferedInputStream(newFileInputStream("datafile"));while((b=in.read())!=-1){...}in.close();
这是我们几近不必查甚么JDK文档就可以信手拈来的代码段,写的时分也应当思索一下套一个BufferedInputStream的意义安在。另外一个就是我们不怎样看到的PushbackInputStream(其对应的字符流形式为PushbackReader)。在一般形态下,“流”意味着“一次性”,就是说你举行了一次操纵后它的形态就变了,比如读,不管是文件仍是socket,你读的过程当中一个潜伏的“读指针”一样的东东就在挪动,你没法在读今后再从头定位(固然RandomAccessFile是另外一种情形),假如你之前奇异为何数据库操纵中ResultSet里get某个字段今后就不克不及再第二次get它了,这里也许是个注释。但幸亏PushbackInputStream给了我们第二次读的时机。我们先来区分一下“监听”和“截获”的观点,“监听”就是把失掉的动静copy一份,原始动静其实不作任何改动地传送到目标地;而“截获”则是先把动静“拘留收禁”上去,不让其主动转给方针,而是先辈行一些处置今后在转发给方针(假如是收集平安专业的背景常识,也许晓得“监听”是对“秘密性”的打击,而“截获”不但是对“秘密性”仍是对“完全性”的打击)。有的伴侣也许对hook这个名词有些懂得,它是一种Windows的一种动静处置机制,仿佛就是一种动静截获手腕,但我对Windows编程一无所知//shy;别的,假如你熟习Servlet的话,也能找到像Filter如许的处置机制,在对每一个HTTP哀求/应对举行转发之前,先在外头耍一点把戏,断定哪些予以转发,哪些屏障失落,这也算是“截获”吧。经由过程下面的先容,我们无妨把PushbackInputStream当作是对输出流的一种“截获”手腕,个中最主要的办法是unread:
publicvoidunread(intb)throwsIOExceptionpublicvoidunread(byte[]b)throwsIOExceptionpublicvoidunread(byte[]b,intoff,intlen)throwsIOException
我们能够设想一下,PushbackInputStream内置一个缓冲区(现实上,你能够从它的源代码里找到这个protected的字节数组),当低层流出去时先流进这个buffer,在你把流“完璧归赵”之前另有时机对它耍把戏,然后再用unread办法“忏悔”一下,把缓冲区里已读过的内容(通常为没有被修改的,固然你也能够修改它,那就得到“回赵”的意义了,由于已不是“完璧”了)再拔出到流的头部,下次读的时分是流残剩的部分再加上从缓冲区“偿还”的部分。下面三个unread办法分离代表从缓冲区“偿还”一个字节、一个字节数组和一个字节数组中指定的部分。PushbackInputStream是对二进制流的处置,字符流下绝对应的就是PushbackReader。

有甚么用?

学过编译的话就简单了解了,好比从左向右扫描字符流“for(inti=0;i<10;i++)”,扫描到“for”是否是就能够说是个关头字了呢?不可,说不定前面是“for1”,那就是个变量而不是关头字了,晓得看到“(”才名顿开,哦,我能够平安地说“看到for关头字”了,但“(”还得偿还给输出流,由于必要前面持续扫描。在高低文相干言语里,就更必要这类抵偿机制。又如,在剖析HTML文档的时分,我必要依据它的“meta”标签的“charset”属性来决意利用哪一种字符集举行剖析,但HTML可不是“charset”而是“<html>”开首的哦!以是必要经由过程PushbackInputStream缓冲后面一段内容,等取到字符集称号后在把读到的流全体偿还,再用指定的字符集举行剖析。

参考材料
JavaNetworkProgramming.byElliotteR.Haroldzms兄在水母的帖子.byzms(无法的是,水木清华已不克不及对校外开放了)JDK1.4.2Documentation.byjava.sun.com
你希望java的IDE整合。这个是没有必要的,重要的是你理解java有多深以及怎么组织你的代码,即使没有IDE,代码照样能够编译运行的。
透明 该用户已被删除
沙发
发表于 2015-1-21 15:16:21 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
再见西城 该用户已被删除
板凳
发表于 2015-1-21 21:18:18 | 只看该作者
是一种为 Internet发展的计算机语言
柔情似水 该用户已被删除
地板
发表于 2015-1-30 22:31:47 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
深爱那片海 该用户已被删除
5#
发表于 2015-1-30 23:27:30 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
兰色精灵 该用户已被删除
6#
发表于 2015-1-31 19:48:41 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
金色的骷髅 该用户已被删除
7#
发表于 2015-2-1 21:22:45 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
愤怒的大鸟 该用户已被删除
8#
发表于 2015-2-7 15:08:53 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
分手快乐 该用户已被删除
9#
发表于 2015-2-22 08:43:48 | 只看该作者
是一种为 Internet发展的计算机语言
第二个灵魂 该用户已被删除
10#
发表于 2015-3-5 03:35:45 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
山那边是海 该用户已被删除
11#
发表于 2015-3-11 23:09:36 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
简单生活 该用户已被删除
12#
发表于 2015-3-17 08:08:27 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
13#
发表于 2015-3-24 02:21:57 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
灵魂腐蚀 该用户已被删除
14#
发表于 2015-3-28 01:33:36 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
小女巫 该用户已被删除
15#
发表于 2015-4-6 13:00:18 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
若相依 该用户已被删除
16#
发表于 2015-4-10 13:54:01 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
乐观 该用户已被删除
17#
发表于 2015-4-12 09:19:10 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
变相怪杰 该用户已被删除
18#
发表于 2015-4-13 09:21:24 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
逍遥一派 该用户已被删除
19#
 楼主| 发表于 2015-5-6 17:09:52 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
蒙在股里 该用户已被删除
20#
发表于 2015-6-6 04:10:38 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 21:52

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表