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 | 
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.