File: Pipe.java

package info (click to toggle)
natbraille 2.0rc3-14
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 7,080 kB
  • sloc: java: 31,266; xml: 7,747; sh: 165; haskell: 50; makefile: 32
file content (131 lines) | stat: -rw-r--r-- 3,843 bytes parent folder | download | duplicates (7)
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();
   }
}