HowToDoInJava

  • Python
  • Java
  • Spring Boot
  • Dark Mode
Home / Java / Java New Input/Output / Java NIO Read File Example

Java NIO Read File Example

Learn to read a file from the filesystem using the Java NIO APIs i.e using buffer, channel, and path classes.

1. FileChannel and ByteBuffer to read small files

Use this technique to read a small file where all the file content is fits into the buffer, and the file can be read in a single operation.

Example 1: Java read small file using ByteBuffer and RandomAccessFile

package com.howtodoinjava.test.nio;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class ReadFileWithFileSizeBuffer
{
	public static void main(String args[])
	{
		try 
		{
			RandomAccessFile aFile = new RandomAccessFile("test.txt","r");

			FileChannel inChannel = aFile.getChannel();
			long fileSize = inChannel.size();

			ByteBuffer buffer = ByteBuffer.allocate((int) fileSize);
			inChannel.read(buffer);
			buffer.flip();

			//Verify the file content
			for (int i = 0; i < fileSize; i++)
			{
				System.out.print((char) buffer.get());
			}

			inChannel.close();
			aFile.close();
		} 
		catch (IOException exc)
		{
			System.out.println(exc);
			System.exit(1);
		}
	}
}

2. FileChannel and ByteBuffer to read large files

Use this technique to read the large file where all the file content will not fit into the buffer at a time, the buffer size will be needed of some very big number. In this case, we can read the file in chunks with a fixed size small buffer.

Example 2: Java read a large file in chunks with fixed-size buffer

package com.howtodoinjava.test.nio;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class ReadFileWithFixedSizeBuffer 
{
	public static void main(String[] args) throws IOException 
	{
		RandomAccessFile aFile = new RandomAccessFile("test.txt", "r");

	    FileChannel inChannel = aFile.getChannel();

	    ByteBuffer buffer = ByteBuffer.allocate(1024);
	    while(inChannel.read(buffer) > 0)
	    {
	    	buffer.flip();
	    	for (int i = 0; i < buffer.limit(); i++)
			{
				System.out.print((char) buffer.get());
			}
	    	buffer.clear(); // do something with the data and clear/compact it.
	    }

	    inChannel.close();
	    aFile.close();
	}
}

3. Read a file using MappedByteBuffer

MappedByteBuffer extends the ByteBuffer class with operations that are specific to memory-mapped file regions.

Example 3: Reading a file using memory-mapped files in Java

package com.howtodoinjava.test.nio;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class ReadFileWithMappedByteBuffer 
{
	public static void main(String[] args) throws IOException 
	{
		RandomAccessFile aFile = new RandomAccessFile("test.txt", "r");

	    FileChannel inChannel = aFile.getChannel();
	    MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());

	    buffer.load();	
    	for (int i = 0; i < buffer.limit(); i++)
		{
			System.out.print((char) buffer.get());
		}
	    buffer.clear(); // do something with the data and clear/compact it.

	    inChannel.close();
	    aFile.close();
	}
}

All the above techniques will read the content of the file and print it to the console.

Happy Learning !!

Was this post helpful?

Let us know if you liked the post. That’s the only way we can improve.
TwitterFacebookLinkedInRedditPocket

About Lokesh Gupta

A family guy with fun loving nature. Love computers, programming and solving everyday problems. Find me on Facebook and Twitter.

Feedback, Discussion and Comments

  1. Narendra

    June 1, 2016

    MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());

    —-> inChannel.size()
    it looks like size of the file. What will happen if file is having 8-10 GB. Will mappedbytebuffer is suggestible and how internally it will work without out of memory

    • Lokesh Gupta

      June 1, 2016

      It is size of the region to be mapped. It is not buffer size.
      https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#map%28java.nio.channels.FileChannel.MapMode,%20long,%20long%29

  2. Fatih Onur

    February 8, 2015

    Nice examples. I just wonder that on your first example “1) Read a small file in buffer of file size” why did you not use finally{} block for aFile resource?

    • Sylfa

      November 19, 2016

      When you close the reader it will close the file for you, theoretically you would miss the case when the reader throws an exception in the constructor after the file has opened, but I believe the only exceptions that could occur at that time would be things like out of memory and similar which would forcibly close down your JVM anyways.

  3. Animesh

    February 3, 2015

    Hi Lokesh,

    I want to divide an xml file according to size using NIO. We can read char or byte only from buffer, so how can i check whether the xml file is proper or not.

    Animesh

    • Lokesh Gupta

      February 3, 2015

      Brilliant question. And that means I do not know the answer 🙂 I will try to find a solution for this problem when time permits. I you get any solution, then please update me as well. Thanks !!

  4. Tim

    January 15, 2015

    Hi,
    Could you please explain why in the example “1) Read a small file in buffer of file size”, you write:
    20 buffer.rewind();
    21 buffer.flip();

    Wouldn’t be enough to use buffer.flip(), like in the example “2) Read a large file in chunks with fixed size buffer”?

    • Lokesh Gupta

      January 15, 2015

      You are right. I must have forget to comment that line. Actually both methods are almost similar. In fact, you can use rewind( ) to go back and reread the data in a buffer that has already been flipped.

  5. pavan kumar

    August 7, 2014

    How multiple threads could read single file parallely

  6. santanu77

    July 22, 2014

    Hi Lokesh, thanks for the informative write-up. The key difference is that in NIO you are reading a buffer not a stream. And NIO is by design non-blocking. So the thread is not blocked.

  7. Carlos Marin

    May 8, 2014

    Just a question. I have to process huge text files (billions of records, each) line by line. Should I read them with IO, NIO, or NIO2? Which class?

    • Lokesh Gupta

      May 8, 2014

      IO is not good solution. Use ReadFileWithFixedSizeBuffer example. In java 8, you can use https://howtodoinjava.com/java8/read-file-line-by-line/

  8. a.b

    September 8, 2013

    Sorry but the old famous way do not the same – here is reading line by line – and with a Reader.
    The three other sources reading byte by byte – with a stream.

    No good!

    • Lokesh Gupta

      September 8, 2013

      Dear friend, it’s not about lines or bytes or streams. It’s about how it was and how it is.

  9. Anonymous

    May 7, 2013

    very useful
    thanks

Comments are closed on this article!

Search Tutorials

Java New IO

  • Java NIO Introduction
  • Java NIO Path
  • Java NIO Buffers
  • Java NIO Channels
  • Java NIO Read File
  • Java NIO MappedByteBuffer
  • Java NIO Vectored IO
  • Data Transfer between Channels

Java Tutorial

  • Java Introduction
  • Java Keywords
  • Java Flow Control
  • Java OOP
  • Java Inner Class
  • Java String
  • Java Enum
  • Java Collections
  • Java ArrayList
  • Java HashMap
  • Java Array
  • Java Sort
  • Java Clone
  • Java Date Time
  • Java Concurrency
  • Java Generics
  • Java Serialization
  • Java Input Output
  • Java New I/O
  • Java Exceptions
  • Java Annotations
  • Java Reflection
  • Java Garbage collection
  • Java JDBC
  • Java Security
  • Java Regex
  • Java Servlets
  • Java XML
  • Java Puzzles
  • Java Examples
  • Java Libraries
  • Java Resources
  • Java 14
  • Java 12
  • Java 11
  • Java 10
  • Java 9
  • Java 8
  • Java 7

Meta Links

  • About Me
  • Contact Us
  • Privacy policy
  • Advertise
  • Guest and Sponsored Posts

Recommended Reading

  • 10 Life Lessons
  • Secure Hash Algorithms
  • How Web Servers work?
  • How Java I/O Works Internally?
  • Best Way to Learn Java
  • Java Best Practices Guide
  • Microservices Tutorial
  • REST API Tutorial
  • How to Start New Blog

Copyright © 2020 · HowToDoInjava.com · All Rights Reserved. | Sitemap

  • Sealed Classes and Interfaces