|
Raw Input and Output in Java
An Introduction |
|
Prof. David Bernstein |
| Computer Science Department |
| bernstdh@jmu.edu |
OutputStream Classwrite() Methods:
byte or array of bytes
close()
flush()
PrintStream ClassInputStream Classread Methods:
byte or array of bytes
available()
skip()
DataInputStream ClassreadLine() Method:
String
package streams;
import java.awt.Desktop;
import java.io.*;
import java.net.*;
import java.util.*;
/**
* A class that performs Google searches.
*
* Specifically, this class creates a new thread of execution that
* continuously reads from a DataInputStream. A Google search is
* conducted for each line that is read.
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class Googler implements Runnable
{
private DataInputStream in;
private Desktop desktop;
private Thread controlThread;
/**
* Explicit Value Constructor
*
* @param in The DataInputStream to read from
*/
public Googler(DataInputStream in)
{
this.in = in;
desktop = Desktop.getDesktop();
}
/**
* The code to execute (required by Runnable).
*/
public void run()
{
String line;
URI uri;
try
{
while ((line = in.readLine()) != null)
{
uri = new URI("http",null,"www.google.com",-1,
"/search","q="+line,null);
desktop.browse(uri); // Returns immediately
}
}
catch (IOException ioe)
{
// Print the complete trace of the exception
ioe.printStackTrace();
}
catch (URISyntaxException use)
{
// Print the complete trace of the exception
use.printStackTrace();
}
}
/**
* Start this Googler (in its own thread of execution).
*/
public void start()
{
if (controlThread == null)
{
controlThread = new Thread(this);
controlThread.start();
}
}
}
A Driver for the Googler
import java.io.*;
import streams.Googler;
/**
* A driver for the Googler class.
*
* This version makes it difficult/impossible to prompt the user
* for input.
*
* @version 1.0
* @author Prof. David Bernstein, James Madison University
*/
public class GooglerDriver1
{
/**
* The entry point
*
* @param args The command-line arguments
*/
public static void main(String[] args)
{
DataInputStream dis;
Googler googler;
dis = new DataInputStream(System.in);
googler = new Googler(dis);
googler.start();
}
}
package streams;
import java.io.*;
import java.util.*;
/**
* A factory for constructing pairs of "piped streams"
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class PipedStreamFactory
{
private PipedInputStream in;
private PipedOutputStream out;
/**
* Default Constructor
*/
public PipedStreamFactory()
{
try
{
in = new PipedInputStream();
out = new PipedOutputStream(in);
}
catch (IOException ioe)
{
in = null;
out = null;
}
}
/**
* Get the PipedInputStream
*
* @return The PipedInputStream
*/
public PipedInputStream getInputStream() throws IOException
{
if (in == null) throw new IOException();
return in;
}
/**
* Get the PipedOutputStream
*
* @return The PipedOutputStream
*/
public PipedOutputStream getOutputStream() throws IOException
{
if (out == null) throw new IOException();
return out;
}
}
A Better Driver for the Googler
import java.io.*;
import streams.Googler;
import streams.PipedStreamFactory;
/**
* A driver for the Googler class.
*
* This version allows for line-by-line prompting
* by using PipedStream objects
*
* @version 1.0
* @author Prof. David Bernstein, James Madison University
*/
public class GooglerDriver2
{
/**
* The entry point
*
* @param args The command-line arguments
*/
public static void main(String[] args) throws IOException
{
DataInputStream console, dis;
Googler googler;
PipedInputStream pin;
PipedOutputStream pout;
PipedStreamFactory factory;
PrintStream out;
String line;
factory = new PipedStreamFactory();
pin = factory.getInputStream();
pout = factory.getOutputStream();
console = new DataInputStream(System.in);
dis = new DataInputStream(pin);
out = new PrintStream(pout);
googler = new Googler(dis);
googler.start();
System.out.print("Search for: ");
while ((line = console.readLine()) != null)
{
out.println(line);
System.out.print("Search for: ");
}
}
}
String in a Stream /**
* Create a "line-based" InputStream from a String that is
* delimited using other characters
*
* @param s The source String to use
* @param delimiter The String used to delimit the "lines" in the source
*/
public static InputStream createInputStream(String s, String delimiter)
{
ByteArrayInputStream bis;
s = s.replaceAll(delimiter, "\r\n");
s = s.concat("\r\n");
bis = new ByteArrayInputStream(s.getBytes());
return bis;
}