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