In: Computer Science
Read the input one line at a time until you have read all lines. Now output these lines in the opposite order from which they were read..
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class Part12 {
  
   /**
   * Your code goes here - see Part0 for an example
   * @param r the reader to read from
   * @param w the writer to write to
   * @throws IOException
   */
   public static void doIt(BufferedReader r, PrintWriter
w) throws IOException {
       // Your code goes here - see Part0
for an example
   }
   /**
   * The driver. Open a BufferedReader and a PrintWriter,
either from System.in
   * and System.out or from filenames specified on the
command line, then call doIt.
   * @param args
   */
   public static void main(String[] args) {
       try {
           BufferedReader
r;
           PrintWriter
w;
           if (args.length
== 0) {
          
    r = new BufferedReader(new
InputStreamReader(System.in));
          
    w = new PrintWriter(System.out);
           } else if
(args.length == 1) {
          
    r = new BufferedReader(new
FileReader(args[0]));
          
    w = new PrintWriter(System.out);  
           
           } else {
          
    r = new BufferedReader(new
FileReader(args[0]));
          
    w = new PrintWriter(new
FileWriter(args[1]));
           }
           long start =
System.nanoTime();
           doIt(r,
w);
           w.flush();
           long stop =
System.nanoTime();
          
System.out.println("Execution time: " + 1e-9 * (stop-start));
       } catch (IOException e) {
          
System.err.println(e);
          
System.exit(-1);
       }
   }
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Part0 {
  
   /**
   * Read lines one at a time from r. After reading all
lines, output
   * all lines to w, outputting duplicate lines only
once. Note: the order
   * of the output is unspecified and may have nothing to
do with the order
   * that lines appear in r.
   * @param r the reader to read from
   * @param w the writer to write to
   * @throws IOException
   */
   public static void doIt(BufferedReader r, PrintWriter
w) throws IOException {
Set<String> s = new HashSet<>();
for (String line = r.readLine(); line != null; line =
r.readLine()) {
s.add(line);
}
for (String text : s) {
w.println(text);
}
   }
   /**
   * The driver. Open a BufferedReader and a PrintWriter,
either from System.in
   * and System.out or from filenames specified on the
command line, then call doIt.
   * @param args
   */
   public static void main(String[] args) {
       try {
           BufferedReader
r;
           PrintWriter
w;
           if (args.length
== 0) {
          
    r = new BufferedReader(new
InputStreamReader(System.in));
          
    w = new PrintWriter(System.out);
           } else if
(args.length == 1) {
          
    r = new BufferedReader(new
FileReader(args[0]));
          
    w = new PrintWriter(System.out);  
           
           } else {
          
    r = new BufferedReader(new
FileReader(args[0]));
          
    w = new PrintWriter(new
FileWriter(args[1]));
           }
           long start =
System.nanoTime();
           doIt(r,
w);
           w.flush();
           long stop =
System.nanoTime();
          
System.out.println("Execution time: " + 1e-9 * (stop-start));
       } catch (IOException e) {
          
System.err.println(e);
          
System.exit(-1);
       }
   }
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Part1 {
        public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
                String line;
                // create a linked list whose elements are String objects
                LinkedList<String> allLines = new LinkedList<String>();
                // read the file line by line
                while((line = r.readLine()) != null) {
                        // remove whitespaces from the line
                        line = line.trim();
                        // if line has characters after removing whitespaces
                        // add the line to the linked list
                        if(!line.isEmpty()){
                                allLines.add(line + "\n");
                        }
                }
                // print the lines in reverse order
                // i.e. traverse the linked list in reverse order
                Iterator it = allLines.descendingIterator();
                
                // while there are more elements
                while(it.hasNext()) {
                        // write the element to stream
                        w.write((String)it.next());
                }
        }
        public static void main(String[] args) {
                try {
                        BufferedReader r;
                        PrintWriter w;
                        if (args.length == 0) {
                                r = new BufferedReader(new InputStreamReader(System.in));
                                w = new PrintWriter(System.out);
                        } 
                        else if (args.length == 1) {
                                r = new BufferedReader(new FileReader(args[0]));
                                w = new PrintWriter(System.out);                
                        } 
                        else {
                                r = new BufferedReader(new FileReader(args[0]));
                                w = new PrintWriter(new FileWriter(args[1]));
                        }
                        long start = System.nanoTime();
                        doIt(r, w);
                        w.flush();
                        long stop = System.nanoTime();
                        System.out.println("Execution time: " + 1e-9 * (stop-start));
                } 
                catch (IOException e) {
                        System.err.println(e);
                        System.exit(-1);
                }
        }
}