-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathPipedOutputStream.java
135 lines (124 loc) · 4 KB
/
PipedOutputStream.java
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
132
133
134
135
/*
* @(#)PipedOutputStream.java 1.15 98/07/01
*
* Copyright 1995-1998 by Sun Microsystems, Inc.,
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Sun Microsystems, Inc. ("Confidential Information"). You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Sun.
*/
package java.io;
import java.io.*;
/**
* A piped output stream is the sending end of a communications
* pipe. Two threads can communicate by having one thread send data
* through a piped output stream and having the other thread read the
* data through a piped input stream.
*
* @author James Gosling
* @version 1.15, 07/01/98
* @see java.io.PipedInputStream
* @since JDK1.0
*/
public
class PipedOutputStream extends OutputStream {
/* REMIND: identification of the read and write sides needs to be
more sophisticated. Either using thread groups (but what about
pipes within a thread?) or using finalization (but it may be a
long time until the next GC). */
private PipedInputStream sink;
boolean connected = false;
/**
* Creates a piped output stream connected to the specified piped
* input stream.
*
* @param snk The piped input stream to connect to.
* @exception IOException if an I/O error occurs.
* @since JDK1.0
*/
public PipedOutputStream(PipedInputStream snk) throws IOException {
connect(snk);
}
/**
* Creates a piped output stream that is not yet connected to a
* piped input stream. It must be connected to a piped input stream,
* either by the receiver or the sender, before being used.
*
* @see java.io.PipedInputStream#connect(java.io.PipedOutputStream)
* @see java.io.PipedOutputStream#connect(java.io.PipedInputStream)
* @since JDK1.0
*/
public PipedOutputStream() {
}
/**
* Connects this piped output stream to a receiver.
*
* @param snk the piped output stream to connect to.
* @exception IOException if an I/O error occurs.
* @since JDK1.0
*/
public void connect(PipedInputStream snk) throws IOException {
if (connected || snk.connected) {
throw new IOException("Already connected");
}
sink = snk;
snk.closed = false;
snk.in = -1;
snk.out = 0;
connected = true;
}
/**
* Writes the specified <code>byte</code> to the piped output stream.
*
* @param b the <code>byte</code> to be written.
* @exception IOException if an I/O error occurs.
* @since JDK1.0
*/
public void write(int b) throws IOException {
sink.receive(b);
}
/**
* Writes <code>len</code> bytes from the specified byte array
* starting at offset <code>off</code> to this piped output stream.
*
* @param b the data.
* @param off the start offset in the data.
* @param len the number of bytes to write.
* @exception IOException if an I/O error occurs.
* @since JDK1.0
*/
public void write(byte b[], int off, int len) throws IOException {
sink.receive(b, off, len);
}
/**
* Flushes this output stream and forces any buffered output bytes
* to be written out.
* This will notify any readers that bytes are waiting in the pipe.
*
* @exception IOException if an I/O error occurs.
* @since JDK1.0
*/
public synchronized void flush() throws IOException {
if (sink != null) {
synchronized (sink) {
sink.notifyAll();
}
}
}
/**
* Closes this piped output stream and releases any system resources
* associated with this stream.
*
* @exception IOException if an I/O error occurs.
* @since JDK1.0
*/
public void close() throws IOException {
if (sink != null) {
sink.receivedLast();
}
}
}