1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.net.io;
17
18 import java.io.FilterOutputStream;
19 import java.io.IOException;
20 import java.io.OutputStream;
21 import java.net.Socket;
22
23 /***
24 * This class wraps an output stream, storing a reference to its originating
25 * socket. When the stream is closed, it will also close the socket
26 * immediately afterward. This class is useful for situations where you
27 * are dealing with a stream originating from a socket, but do not have
28 * a reference to the socket, and want to make sure it closes when the
29 * stream closes.
30 * <p>
31 * <p>
32 * @author Daniel F. Savarese
33 * @see SocketInputStream
34 ***/
35
36 public class SocketOutputStream extends FilterOutputStream
37 {
38 private Socket __socket;
39
40 /***
41 * Creates a SocketOutputStream instance wrapping an output stream and
42 * storing a reference to a socket that should be closed on closing
43 * the stream.
44 * <p>
45 * @param socket The socket to close on closing the stream.
46 * @param stream The input stream to wrap.
47 ***/
48 public SocketOutputStream(Socket socket, OutputStream stream)
49 {
50 super(stream);
51 __socket = socket;
52 }
53
54
55 /***
56 * Writes a number of bytes from a byte array to the stream starting from
57 * a given offset. This method bypasses the equivalent method in
58 * FilterOutputStream because the FilterOutputStream implementation is
59 * very inefficient.
60 * <p>
61 * @param buffer The byte array to write.
62 * @param offset The offset into the array at which to start copying data.
63 * @param length The number of bytes to write.
64 * @exception IOException If an error occurs while writing to the underlying
65 * stream.
66 ***/
67 public void write(byte buffer[], int offset, int length) throws IOException
68 {
69 out.write(buffer, offset, length);
70 }
71
72
73 /***
74 * Closes the stream and immediately afterward closes the referenced
75 * socket.
76 * <p>
77 * @exception IOException If there is an error in closing the stream
78 * or socket.
79 ***/
80 public void close() throws IOException
81 {
82 super.close();
83 __socket.close();
84 }
85 }