|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说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的复杂性。 |
|