Here is a simplest Java Program to read a file line by line in reverse order using Java8 APIs. Try it out and let me know if you see any issue with this.
- java program to reverse the contents of a file
- write a program that replaces each line of a file with its reverse
I’ll be writing Java Interview series in which you will find more related questions and answers. Please stay tuned for more information.
In this tutorial we will go over below steps:
- We will read file
crunchify.txt
which is at location Document. I’m using Macbook pro, so if you are on different OS and laptop/desktop then please change File path accordingly in programCrunchifyReverseLineReader.java
- We will read file in Simple Order first.
- We will read file in Reverse Order then.
Please note
: Below program by default remove all blank lines from reverse order output. If you would like to preserve blank lines then take a look at comment in program itself.- Create file
CrunchifyReverseLineReaderTest.java
and copy code from below to test result.
Java Code:
package crunchify.com.tutorials; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; /** * Read a file from end to start * * @author Crunchify.com */ public class CrunchifyReverseLineReader { private static final int BUFFER_SIZE = 8192; private final FileChannel channel; private final String encoding; private long filePos; private ByteBuffer buf; private int bufPos; private ByteArrayOutputStream baos = new ByteArrayOutputStream(); private RandomAccessFile raf; private byte lastLineBreak = '\n'; public CrunchifyReverseLineReader(File file) throws IOException { this(file, null); } public CrunchifyReverseLineReader(File file, String encoding) throws IOException { raf = new RandomAccessFile(file, "r"); channel = raf.getChannel(); filePos = raf.length(); this.encoding = encoding; } public void close() throws IOException { raf.close(); } public String readLine() throws IOException { byte c; while (true) { if (bufPos < 0) { if (filePos == 0) { if (baos == null) { return null; } String line = bufToString(); baos = null; return line; } long start = Math.max(filePos - BUFFER_SIZE, 0); long end = filePos; long len = end - start; buf = channel.map(FileChannel.MapMode.READ_ONLY, start, len); bufPos = (int) len; filePos = start; // Ignore Empty New Lines c = buf.get(--bufPos); if (c == '\r' || c == '\n') while (bufPos > 0 && (c == '\r' || c == '\n')) { bufPos--; c = buf.get(bufPos); } if (!(c == '\r' || c == '\n')) bufPos++;// IS THE NEW LENE } /* * This will ignore all blank new lines. */ while (bufPos-- > 0) { c = buf.get(bufPos); if (c == '\r' || c == '\n') { // skip \r\n while (bufPos > 0 && (c == '\r' || c == '\n')) { c = buf.get(--bufPos); } // restore cursor if (!(c == '\r' || c == '\n')) bufPos++;// IS THE NEW Line return bufToString(); } baos.write(c); } /* * If you don't want to ignore new line and would like * to print new line too then use below code * and comment out above while loop while (bufPos-- > 0) { byte c1 = buf.get(bufPos); if (c1 == '\r' || c1 == '\n') { if (c1 != lastLineBreak) { lastLineBreak = c1; continue; } lastLineBreak = c1; return bufToString(); } baos.write(c1); } */ } } private String bufToString() throws UnsupportedEncodingException { if (baos.size() == 0) { return ""; } byte[] bytes = baos.toByteArray(); for (int i = 0; i < bytes.length / 2; i++) { byte t = bytes[i]; bytes[i] = bytes[bytes.length - i - 1]; bytes[bytes.length - i - 1] = t; } baos.reset(); if (encoding != null) return new String(bytes, encoding); else return new String(bytes); } }
Updated code to remove blank lines from file as per comment from francesco.
Other must read article: https://crunchify.com/why-and-for-what-should-i-use-enum-java-enum-examples/
Now lets test it. Create Test file.
package crunchify.com.tutorials; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; /** * @author Crunchify.com */ public class CrunchifyReverseLineReaderTest { @SuppressWarnings("resource") public static void main(String[] args) throws IOException { /* * If you want to have blank file and would like to add some lines then use below code * * File file = new File("/Users/appshah/Documents/crunchify.txt"); RandomAccessFile raf = new RandomAccessFile(file, * "rw"); for (int i = 0; i <= 10; i++) { // Adding line from 1 to 10 //raf.writeBytes("Adding Line " + i + "\n"); } * raf.close(); * */ /* * Test - 1: In this tutorial we will read exsiting file crunchify.txt * Reading file in Simple Order */ FileReader logReader = new FileReader("/Users/appshah/Documents/crunchify.txt"); BufferedReader buffer = new BufferedReader(logReader); System.out.println("~~~~~~~~~~~~~~~~~~~Simple way to read file in Java without Reversing ~~~~~~~~~~~~~~~~~~\n"); for (String line1 = buffer.readLine(); line1 != null; line1 = buffer.readLine()) { System.out.println(line1); } /* * Test - 2: In this tutorial we will read exsiting file crunchify.txt * Reading file in Reverse Order */ File file = new File("/Users/appshah/Documents/crunchify.txt"); CrunchifyReverseLineReader reader = new CrunchifyReverseLineReader(file, "UTF-8"); String line; System.out.print("\n~~~~~~~~~~~~~~~~~~~ Reading a file in Reverse Order ~~~~~~~~~~~~~~~~~~~ \n\n"); while ((line = reader.readLine()) != null) { System.out.println(line); } } }
Note:
File crunchify.txt hastotal 11 lines
including 1 blank line in-between as you see in below result.
Output:
~~~~~~~~~~~~~~~~~~~Simple way to read file in Java without Reversing ~~~~~~~~~~~~~~~~~~ —————— Crunchify Tutorials Start—————— How To Troubleshoot Higher CPU, Memory & Process Usage? Top 7 Tips To Speed Up WordPress & Boost Performance Detailed Guide On How To Install SSL On WordPress Site List Of All Genesis WordPress Framework Tips Simplest Hello World Spring MVC Tutorial And JDBC MySQL Tutorial NEW Start Embedded HTTP Jersey Server During Java Application Startup NEWTop 10 Java Interview Questions Answers Java Properties File: How To Read Config.Properties Values In Java? —————— Crunchify Tutorials End —————— ~~~~~~~~~~~~~~~~~~~ Reading a file in Reverse Order ~~~~~~~~~~~~~~~~~~~ —————— Crunchify Tutorials End —————— Java Properties File: How To Read Config.Properties Values In Java? NEWTop 10 Java Interview Questions Answers NEW Start Embedded HTTP Jersey Server During Java Application Startup Simplest Hello World Spring MVC Tutorial And JDBC MySQL Tutorial List Of All Genesis WordPress Framework Tips Detailed Guide On How To Install SSL On WordPress Site Top 7 Tips To Speed Up WordPress & Boost Performance How To Troubleshoot Higher CPU, Memory & Process Usage? —————— Crunchify Tutorials Start——————