You are currently viewing Guide to Java NIO (New I/O) with Examples

Guide to Java NIO (New I/O) with Examples

  • Post author:
  • Post category:Java
  • Post comments:0 Comments
  • Post last modified:July 24, 2024

Introduction:

Java NIO (New I/O) was introduced in Java 1.4 to provide a scalable and efficient I/O framework. Unlike the traditional I/O APIs in java.io, NIO introduces the java.nio package, offering features such as non-blocking I/O and memory-mapped files. In this tutorial, we’ll explore the fundamental concepts of Java NIO and walk through practical examples to illustrate its usage.

Prerequisites:

Before starting the examples, ensure you have:

  1. Java Development Kit (JDK) installed (version 8 or higher).
  2. An Integrated Development Environment (IDE) such as Eclipse or IntelliJ.

Example 1: Buffer Basics

Buffers are central to NIO and are used for reading and writing data. Let’s create a simple example that demonstrates the basic usage of buffers:

This example demonstrates the basic operations of creating a ByteBuffer, putting data into it, flipping it for reading, and then reading the data.

Example 2: Channels and File I/O

NIO introduces the concept of channels for performing I/O operations. Let’s create an example to copy data from one file to another using channels:

In this example, we use the FileChannel class to copy data from one file to another. The transferTo method efficiently transfers data between channels.

Example 3: Asynchronous I/O

Java NIO supports asynchronous I/O operations through the AsynchronousChannel and AsynchronousFileChannel classes. Let’s create an example to read a file asynchronously:

This example demonstrates asynchronous file reading using AsynchronousFileChannel. The read method returns a Future that can be used to check if the operation is complete.

Example: Reading a File as a List of Strings

You can read an entire file into a list of strings using the Files.readAllLines method. This is useful if the file content can fit into memory easily.

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

public class ReadFileExample {
    public static void main(String[] args) {
        // Specify the file path
        Path path = Paths.get("destination.txt");

        try {
            // Read all lines from the file
            List<String> lines = Files.readAllLines(path);

            // Print each line
            for (String line : lines) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.err.println("An error occurred while reading the file: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Example: Reading a File with FileChannel and ByteBuffer

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;
import java.io.IOException;

public class ReadFileWithChannel {
    public static void main(String[] args) {
        // Specify the file path
        Path path = Paths.get("destination.txt");

        // Create a ByteBuffer with a specified capacity
        ByteBuffer buffer = ByteBuffer.allocate(1024); // 1 KB buffer size

        // Use try-with-resources to ensure the channel is closed automatically
        try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {
            // Read data from the file channel into the buffer
            while (fileChannel.read(buffer) > 0) {
                // Flip the buffer to prepare it for reading
                buffer.flip();

                // Process the buffer's content
                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }

                // Clear the buffer to prepare it for the next read operation
                buffer.clear();
            }
        } catch (IOException e) {
            System.err.println("An error occurred while reading the file: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Example: Writing Data to a File Using Files.write

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.nio.charset.StandardCharsets;
import java.io.IOException;
import java.util.List;

public class WriteFileWithoutBuffer {
    public static void main(String[] args) {
        // Specify the file path
        Path path = Paths.get("output.txt");

        // Define the data to write
        String data = "Hello, World!\nWelcome to Java NIO file writing.";
        
        // Write string data to the file
        try {
            // Write the string data to the file as bytes
            Files.write(path, data.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
            System.out.println("Data has been written to the file successfully.");
        } catch (IOException e) {
            System.err.println("An error occurred while writing to the file: " + e.getMessage());
            e.printStackTrace();
        }
        
        // Alternatively, if you have data as a list of strings (each representing a line):
        List<String> lines = List.of("Hello, World!", "Welcome to Java NIO file writing.");
        
        // Write lines to the file
        try {
            // Write the list of strings to the file
            Files.write(path, lines, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
            System.out.println("Lines have been written to the file successfully.");
        } catch (IOException e) {
            System.err.println("An error occurred while writing lines to the file: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Conclusion:

Java NIO provides a powerful and scalable I/O framework, offering features such as buffers, channels, and asynchronous I/O. This tutorial covered basic buffer operations, file I/O using channels, and asynchronous file reading. As you explore further, you’ll discover additional capabilities of Java NIO, making it a valuable tool for efficient and responsive I/O operations in your Java applications.

Leave a Reply