import java.io.*;
import java.net.*;

/**
 * An example that illustrates the flexibility of I/O streams
 * in Java
 *
 * -k              To use the keyboard (tab-delimited)
 * -f filename     To use a file (e.g., cs.txt)
 * -u url          To use a URL  (e.g., http://www.cs.jmu.edu/common/coursedocs/BernsteinMaterials/javaexamples/iobasics/cs.txt)
 */
public class ReaderExample
{
    /**
     * The entry point of the application
     *
     * @param args   The command-line arguments
     */
    public static void main(String[] args) throws IOException
    {
	BufferedReader       myBufferedReader;
	FileReader           myFileReader;
	InputStreamReader    myInputStreamReader;
	PrintWriter          myPrintWriter;
	String               myStringData;
	URL                  myURL;


	myBufferedReader = null;

	// Construct the appropriate kind of BufferedReader based
	// on the command-line options
	if (args[0].equals("-f"))   // says it will read from a file
	   {
	   myFileReader = new FileReader(args[1]);
	   myBufferedReader= new BufferedReader(myFileReader);

	} 
	else 
	   if (args[0].equals("-u"))  // says it will read from a URL
		{
	    	myURL =  new URL(args[1]);
	      myInputStreamReader = new InputStreamReader(myURL.openStream());
         myBufferedReader= new BufferedReader(myInputStreamReader);
	   } 
		else                       // Reads from the keyboard
      {
	      myInputStreamReader = new InputStreamReader(System.in);
	      myBufferedReader= new BufferedReader(myInputStreamReader);
    	}


	   myPrintWriter = new PrintWriter(System.out);

     // Keep reading and printing until EOF
	  do 
	  {
 	    myStringData = myBufferedReader.readLine();
	    if (myStringData != null) 
		 {
		    myPrintWriter.println(myStringData);
          myPrintWriter.flush();
	    }

	  } while (myStringData != null);
   
   } // end main
} // end class
