View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package examples.util;
19  
20  import java.io.IOException;
21  import java.io.InputStream;
22  import java.io.OutputStream;
23  import org.apache.commons.net.io.Util;
24  
25  /***
26   * This is a utility class providing a reader/writer capability required
27   * by the weatherTelnet, rexec, rshell, and rlogin example programs.
28   * The only point of the class is to hold the static method readWrite
29   * which spawns a reader thread and a writer thread.  The reader thread
30   * reads from a local input source (presumably stdin) and writes the
31   * data to a remote output destination.  The writer thread reads from
32   * a remote input source and writes to a local output destination.
33   * The threads terminate when the remote input source closes.
34   * <p>
35   ***/
36  
37  public final class IOUtil
38  {
39  
40      public static final void readWrite(final InputStream remoteInput,
41                                         final OutputStream remoteOutput,
42                                         final InputStream localInput,
43                                         final OutputStream localOutput)
44      {
45          Thread reader, writer;
46  
47          reader = new Thread()
48                   {
49                       @Override
50                       public void run()
51                       {
52                           int ch;
53  
54                           try
55                           {
56                               while (!interrupted() && (ch = localInput.read()) != -1)
57                               {
58                                   remoteOutput.write(ch);
59                                   remoteOutput.flush();
60                               }
61                           }
62                           catch (IOException e)
63                           {
64                               //e.printStackTrace();
65                           }
66                       }
67                   }
68                   ;
69  
70  
71          writer = new Thread()
72                   {
73                       @Override
74                       public void run()
75                       {
76                           try
77                           {
78                               Util.copyStream(remoteInput, localOutput);
79                           }
80                           catch (IOException e)
81                           {
82                               e.printStackTrace();
83                               System.exit(1);
84                           }
85                       }
86                   };
87  
88  
89          writer.setPriority(Thread.currentThread().getPriority() + 1);
90  
91          writer.start();
92          reader.setDaemon(true);
93          reader.start();
94  
95          try
96          {
97              writer.join();
98              reader.interrupt();
99          }
100         catch (InterruptedException e)
101         {
102         }
103     }
104 
105 }
106