Line Filters in Java

A line filter is a common type of program that reads input on stdin, processes it, and then prints some derived result to stdout. grep and sed are common line filters.

Here’s an example line filter in Java that writes a capitalized version of all input text. You can use this pattern to write your own Java line filters.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class LineFilter {
    public static void main(String[] args) {
        // Wrapping System.in with a BufferedReader gives us a convenient
        // readLine method that advances the reader to the next line.
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        try {
            String line;
            // readLine returns null when it reaches the end of the input
            while ((line = reader.readLine()) != null) {
                // Convert the line to uppercase
                String ucl = line.toUpperCase();

                // Write out the uppercased line
                System.out.println(ucl);
            }
        } catch (IOException e) {
            // Check for errors during reading
            System.err.println("error: " + e.getMessage());
            System.exit(1);
        }
    }
}

To try out our line filter, first make a file with a few lowercase lines.

$ echo 'hello'   > /tmp/lines
$ echo 'filter' >> /tmp/lines

Then use the line filter to get uppercase lines.

$ cat /tmp/lines | java LineFilter
HELLO
FILTER

In this Java version, we use BufferedReader to read input line by line, similar to the bufio.Scanner in the original example. The readLine() method serves a similar purpose to Scan() in Go, advancing to the next line of input.

We use a try-catch block to handle potential IOExceptions that might occur during reading, which is equivalent to checking the scanner’s error in the Go version.

The rest of the logic remains largely the same: we read each line, convert it to uppercase, and print it out.

Remember to compile the Java file before running it:

$ javac LineFilter.java
$ cat /tmp/lines | java LineFilter

This example demonstrates how to create a simple line filter in Java, processing input line by line and producing modified output.