Java NIO

The newer version of the Java I/O system is called NIO (short for New I/O), it supports a buffer-oriented channel-based approach to I/O operations. The NIO system offers enchanced support for file-handling and file system features. However better NIO developers seem to still like the older I/O, but I will give a brief introduction and some examples in this section.

Firstly lets see the NIO classes

Package Purpose
java.nio top-level for the NIO system, encapsulates various types of buffers that contain data operated upon the NIO system
java,nio.channels channels are open I/O connections
java.nio.channels.spi support for service providers for channels
java.nio.charset encapsulates character set, also support encoders and decoders that convert characters to bytes and bytes to characetrs.
java.nio.charset.spi supports service providers for character sets
java.nio.file provides support for files
java.nio.file.attribute provides support for file attributes
java.nio.file.spi supports service providers for file system

NIO Fundamentals

The NIO system is built on item items, buffers and channels, you open a channel and use buffers to hold the data

Two other entities used by the NIO system are charsets and selectors

From Java 7 enchancements were added Path Interface, Files Class and File Attribute Interfaces and the FileSystem, Filesystems and FileStore Classes

NIO file attributes example
Path filepath = Paths.get("src/NIOTest1.java");

System.out.println("File Name: " + filepath.getName(1));
System.out.println("Path: " + filepath);
System.out.println("Absolute Path: " + filepath.toAbsolutePath());
System.out.println("Parent: " + filepath.getParent());

if(Files.exists(filepath))
    System.out.println("File exists");
else
    System.out.println("File does not exist");

try {
    if(Files.isHidden(filepath))
        System.out.println("File is hidden");
    else
        System.out.println("File is not hidden");
} catch(IOException e) {
    System.out.println("I/O Error: " + e);
}

Files.isWritable(filepath);
System.out.println("File is writeable");

Files.isReadable(filepath);
System.out.println("File is readable");
NIO writing and reading a file example
 // Writing to a file using a try-with-resources block.
try ( FileChannel fChan = (FileChannel) Files.newByteChannel(Paths.get("NIOtest.txt"), 
      StandardOpenOption.WRITE, StandardOpenOption.CREATE) )
{
    // Create a buffer.
    ByteBuffer mBuf = ByteBuffer.allocate(26);

    // Write some bytes to the buffer.
    for(int i=0; i < 26; i++)
        mBuf.put((byte)('A' + i));

    // Reset the buffer so that it can be written.
    mBuf.rewind();

    // Write the buffer to the output file.
    fChan.write(mBuf);

} catch(InvalidPathException e) {
    System.out.println("Path Error " + e);
} catch (IOException e) {
    System.out.println("I/O Error: " + e);
    System.exit(1);
}

// Read a file using a try-with-resources block.
try ( FileChannel fChan = (FileChannel) Files.newByteChannel(Paths.get("NIOtest.txt")) )
{
    // Get the size of the file.
    long fSize = fChan.size();

    // Now, map the file into a buffer.
    MappedByteBuffer mBuf = fChan.map(FileChannel.MapMode.READ_ONLY, 0, fSize);

    // Read and display bytes from buffer.
    for(int i=0; i < fSize; i++)
        System.out.print((char)mBuf.get());

    System.out.println();

} catch(InvalidPathException e) {
    System.out.println("Path Error " + e);
} catch (IOException e) {
    System.out.println("I/O Error " + e);
}
NIO using walkFileTree example
// Create a custom version of SimpleFileVisitor that overrides the visitFile( ) method.
class MyFileVisitor extends SimpleFileVisitor<Path> {
    public FileVisitResult visitFile(Path path, BasicFileAttributes attribs) throws IOException
    {
        System.out.println(path);
        return FileVisitResult.CONTINUE;
    }
}

Main
----------------------------------------------
String dirname = "src";

System.out.println("Directory tree starting with " + dirname + ":\n");

try {
    Files.walkFileTree(Paths.get(dirname), new MyFileVisitor());
} catch (IOException exc) {
    System.out.println("I/O Error");
}

There are many more areas in NIO to explore and I will leave you to learn and play around with the NIO system.