发布一篇java io进修(三) 管道的简介,源码剖析和示例
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。管道(PipedOutputStream和PipedInputStream)的简介,源码剖析和示例
本章,我们对java管道举行进修。
java管道先容
<p>在java中,PipedOutputStream和PipedInputStream分离是管道输入流和管道输出流。<p>它们的感化是让多线程能够经由过程管道举行线程间的通信。在利用管道通讯时,必需将PipedOutputStream和PipedInputStream配套利用。利用管道通讯时,大抵的流程是:我们在线程A中向PipedOutputStream中写进数据,这些数据会主动的发送到与PipedOutputStream对应的PipedInputStream中,进而存储在PipedInputStream的缓冲中;此时,线程B经由过程读取PipedInputStream中的数据。就能够完成,线程A和线程B的通讯。
PipedOutputStream和PipedInputStream源码剖析
<p>上面先容PipedOutputStream和PipedInputStream的源码。在浏览它们的源码之前,倡议先看看源码前面的示例。待了解管道的感化和用法以后,再看源码,大概更简单了解。<p>别的,因为在“javaio系列03之ByteArrayOutputStream的简介,源码剖析和示例(包含OutputStream)”中已对PipedOutputStream的父类OutputStream举行了先容,这里就不再先容OutputStream。在“javaio系列02之ByteArrayInputStream的简介,源码剖析和示例(包含InputStream)”中已对PipedInputStream的父类InputStream举行了先容,这里也不再先容InputStream。
<p>1.PipedOutputStream源码剖析(基于jdk1.7.40)
packagejava.io;
importjava.io.*;
publicclassPipedOutputStreamextendsOutputStream{
//与PipedOutputStream通讯的PipedInputStream对象
privatePipedInputStreamsink;
//机关函数,指定配对的PipedInputStream
publicPipedOutputStream(PipedInputStreamsnk)throwsIOException{
connect(snk);
}
//机关函数
publicPipedOutputStream(){
}
//将“管道输入流”和“管道输出流”毗连。
publicsynchronizedvoidconnect(PipedInputStreamsnk)throwsIOException{
if(snk==null){
thrownewNullPointerException();
}elseif(sink!=null||snk.connected){
thrownewIOException("Alreadyconnected");
}
//设置“管道输出流”
sink=snk;
//初始化“管道输出流”的读写地位
//int是PipedInputStream中界说的,代表“管道输出流”的读写地位
snk.in=-1;
//初始化“管道输入流”的读写地位。
//out是PipedInputStream中界说的,代表“管道输入流”的读写地位
snk.out=0;
//设置“管道输出流”和“管道输入流”为已毗连形态
//connected是PipedInputStream中界说的,用于暗示“管道输出流与管道输入流”是不是已毗连
snk.connected=true;
}
//将int范例b写进“管道输入流”中。
//将b写进“管道输入流”以后,它会将b传输给“管道输出流”
publicvoidwrite(intb)throwsIOException{
if(sink==null){
thrownewIOException("Pipenotconnected");
}
sink.receive(b);
}
//将字节数组b写进“管道输入流”中。
//将数组b写进“管道输入流”以后,它会将其传输给“管道输出流”
publicvoidwrite(byteb[],intoff,intlen)throwsIOException{
if(sink==null){
thrownewIOException("Pipenotconnected");
}elseif(b==null){
thrownewNullPointerException();
}elseif((off<0)||(off>b.length)||(len<0)||
((off+len)>b.length)||((off+len)<0)){
thrownewIndexOutOfBoundsException();
}elseif(len==0){
return;
}
//“管道输出流”吸收数据
sink.receive(b,off,len);
}
//清空“管道输入流”。
//这里会挪用“管道输出流”的notifyAll();
//目标是让“管道输出流”保持对以后资本的占据,让别的的守候线程(守候读取管道输入流的线程)读取“管道输入流”的值。
publicsynchronizedvoidflush()throwsIOException{
if(sink!=null){
synchronized(sink){
sink.notifyAll();
}
}
}
//封闭“管道输入流”。
//封闭以后,会挪用receivedLast()关照“管道输出流”它已封闭。
publicvoidclose()throwsIOException{
if(sink!=null){
sink.receivedLast();
}
}
}<p>
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
页:
[1]