Read from Console using pipes
We see the use of a buffered reader and writer and a piped reader and writer. The example also demonstrates how to read from a console continuously. The example reads from a console using a buffered reader, passes the characters to a piped writer. A piped reader reads the characters and writes to a file using buffered writer
PipedReader pipedReader = new PipedReader();
PipedWriter pipedWriter = new PipedWriter(pipedReader);
screenReader reader = new screenReader(pipedWriter);
OutputWriter writer = new OutputWriter(pipedReader);
reader.start();
writer.start();
// A Reader thread to read continously from the input. The characters read are written to a piped writer
class screenReader extends Thread {
PipedWriter writer;
public screenReader(PipedWriter writer) {
this.writer = writer;
}
@Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
while (true) {
try {
String s = reader.readLine();
if ("exit".equals(s.trim())) {
reader.close();
writer.close();
break;
}
writer.write(s);
} catch (IOException e) {
}
}
}
}
// A writer thread to write data to a file. The data is read from a piped reader
class OutputWriter extends Thread {
PipedReader reader = null;
public OutputWriter(PipedReader reader) {
this.reader = reader;
}
@Override
public void run() {
try {
PrintWriter writer = new PrintWriter(new FileWriter(
"pipedOut.txt"), true);
BufferedReader consoleReader = new BufferedReader(reader);
while (true) {
String s = consoleReader.readLine();
if (s == null) {
reader.close();
writer.close();
return;
}
writer.println(s);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Writing to a text file- PrintWriter
Print Writer is a very useful class to write to text files. It enables writing without throwing IOException and automatic flushing. It has methods to combine the step of writing a line of text, writing a new line and flushing in a single step.
//Create a PrintWriter
PrintWriter writer = new PrintWriter(new File("output.txt"));
// It is also possible to create a filewriter with automatic flushing.
// However autoflushing only happens when one of the println,printf or format methods are called.
PrintWriter writer2 = new PrintWriter(new BufferedWriter(new FileWriter(new File("output2.txt"))), true);
//Write characters to file using printwriter. All methods do the same thing
writer.append('a');
writer.write('b');
writer.print('k');
//write part of string to a file
writer.append("def", 1, 1);
writer.write("keep", 2, 2);
//write java objects to a file
writer.print(true);
// double
writer.print(1.434);
// float
writer.print(1.23f);
writer.print(2);
// writes any object to a file by calling its toString method.
writer.print(writer);
// terminates the current line. Uses the system specific line separator.
writer.println();
// use println methods with any object to write the string
//representation of the object followed by a new line.
writer.println(3);
// Write writer formatted string to file.
// The java formatter can be used to format a string. This method writes
// formatted string to a file based on the default formatter
writer.printf("%a", 34.0);
// the flush method needs to be called explicitly unless one of the
// methods that flush automatically are called.
writer.flush();
//Check for errors since PrintWriter does not throw IOException
writer.checkError();
writer.close();