1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/**************************************************************************
/* This class implements a pipe.
/*
/* Copyright (c) 2009 by Bernhard Bablok (mail@bablokb.de)
/*
/* This program is free software; you can redistribute it and/or modify
/* it under the terms of the GNU Library General Public License as published
/* by the Free Software Foundation; either version 2 of the License or
/* (at your option) any later version.
/*
/* This program is distributed in the hope that it will be useful, but
/* WITHOUT ANY WARRANTY; without even the implied warranty of
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
/* GNU Library General Public License for more details.
/*
/* You should have received a copy of the GNU Library General Public License
/* along with this program; see the file COPYING.LIB. If not, write to
/* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
/* Boston, MA 02111-1307 USA
/**************************************************************************/
package org.im4java.process;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.IOException;
/**
This class implements a pipe. Useful for piping input to a process
or piping output/error from a process to other streams.
<p>You can use the same Pipe-object for both ends of a process-pipeline.
But you cannot use the same Pipe-object as an OutputConsumer and
ErrorConsumer at the same time.</p>
@version $Revision: 1.4 $
@author $Author: bablokb $
*/
public class Pipe implements InputProvider, OutputConsumer, ErrorConsumer {
//////////////////////////////////////////////////////////////////////////////
/**
Default buffer size of the pipe. Currently 64KB.
*/
public static final int BUFFER_SIZE=65536;
//////////////////////////////////////////////////////////////////////////////
/**
The source of data (i.e. this pipe will provide input for a process).
*/
private InputStream iSource;
//////////////////////////////////////////////////////////////////////////////
/**
The sink for data (i.e. this pipe will consume output of a process).
*/
private OutputStream iSink;
//////////////////////////////////////////////////////////////////////////////
/**
Constructor. At least one of the arguments should not be null.
*/
public Pipe(InputStream pSource, OutputStream pSink) {
iSource = pSource;
iSink = pSink;
}
//////////////////////////////////////////////////////////////////////////////
/**
The InputProvider must write the input to the given OutputStream.
*/
public void provideInput(OutputStream pOutputStream) throws IOException {
copyBytes(iSource,pOutputStream);
}
//////////////////////////////////////////////////////////////////////////////
/**
The OutputConsumer must read the output of a process from the given
InputStream.
*/
public void consumeOutput(InputStream pInputStream) throws IOException {
if (iSink != null) {
copyBytes(pInputStream,iSink);
}
}
//////////////////////////////////////////////////////////////////////////////
/**
The ErrorConsumer must read the error of a process from the given
InputStream.
*/
public void consumeError(InputStream pInputStream) throws IOException {
if (iSink != null) {
copyBytes(pInputStream,iSink);
}
}
//////////////////////////////////////////////////////////////////////////////
/**
Copy bytes from an InputStream to an OutputStream.
*/
private void copyBytes(InputStream pIs, OutputStream pOs) throws IOException {
byte[] buffer = new byte[BUFFER_SIZE];
while (true) {
int byteCount = pIs.read(buffer);
if (byteCount == -1) {
break;
}
pOs.write(buffer,0,byteCount);
}
pOs.flush();
}
}
|