An NIO.2 substitute for Android
Switch branches/tags
Nothing to show
Clone or download
Latest commit 1b4e4e4 Jan 2, 2017

NNIO: A Java NIO.2 Substitute Library

Build Status

NNIO ("Not NIO") is an experimental porting strategy for code that depends on Java NIO.2 API (for example, classes in the java.nio.file package). It provides a replacement subset of NIO.2 under a different package name. The subset is implemented with the pre-NIO.2 file API, and as a result should be usable to code using a language level lower than Java 7 or built for Android.

To use NNIO, you have to substitute NIO.2 package names with NNIO ones. For example, java.nio.file.Path becomes org.lukhnos.nnio.file.Path.

This is a work in progress. I only plan to backport a very small subset of NIO.2, and there are a lot different backporting strategies to explore. Open questions include how to integrate with an app's existing build system, especially if code generation or preprocessing is required (so as to facilitate the global substitution of NIO.2 package names). In addition, not all NIO.2 API is backportable, as some of those (such as the file system API) requires native implementations. It's currently a non-goal for NNIO to include any native code.

Quick Start

Have your project depend on nnio. Suppose you use Gradle:

repositories {

dependencies {
  compile 'org.lukhnos:nnio:0.2'

Then replace your java.nio.file and java.nio.channels imports with org.lukhnos.nnio.file and org.lukhnos.nnio.channels respectively. If you run into errors such as missing classes or methods, this means the items in question are not backported to nnio. :)

Project Goal

This project aims to backport commonly used NIO.2 classes and methods to allow Android apps to include code that depends on NIO.2.


Anything that requires native implementation (for example, getting file creation time, which does not support) is a non-goal for this library.

In addition, a sound file system library is hard to implement. This project does not aim to address every fine aspect -- the goal is to backport enough code to make it practical to use code that depends on NIO.2. It's up to the library user (you) to make sure that the operations are safe and correct to your need and standard. It's also a non-goal to make the library work on Windows file system.

Classes Supported

Please note that while Files and Path have a larger coverage, a lot of the classes listed here are stubs.

  • org.lukhnos.nnio.channels.AsynchronousChannel
  • org.lukhnos.nnio.channels.AsynchronousFileChannel
  • org.lukhnos.nnio.channels.CompletionHandler
  • org.lukhnos.nnio.file.AccessDeniedException
  • org.lukhnos.nnio.file.AccessMode
  • org.lukhnos.nnio.file.AtomicMoveNotSupportedException
  • org.lukhnos.nnio.file.attribute.AttributeView
  • org.lukhnos.nnio.file.attribute.BasicFileAttributes
  • org.lukhnos.nnio.file.attribute.BasicFileAttributeView
  • org.lukhnos.nnio.file.attribute.FileAttribute
  • org.lukhnos.nnio.file.attribute.FileAttributeView
  • org.lukhnos.nnio.file.attribute.FileStoreAttributeView
  • org.lukhnos.nnio.file.attribute.FileTime
  • org.lukhnos.nnio.file.attribute.UserPrincipalLookupService
  • org.lukhnos.nnio.file.CopyOption
  • org.lukhnos.nnio.file.DirectoryStream
  • org.lukhnos.nnio.file.FileAlreadyExistsException
  • org.lukhnos.nnio.file.Files
  • org.lukhnos.nnio.file.FileStore
  • org.lukhnos.nnio.file.FileSystem
  • org.lukhnos.nnio.file.FileSystemException
  • org.lukhnos.nnio.file.FileSystems
  • org.lukhnos.nnio.file.FileVisitor
  • org.lukhnos.nnio.file.FileVisitResult
  • org.lukhnos.nnio.file.InvalidPathException
  • org.lukhnos.nnio.file.LinkOption
  • org.lukhnos.nnio.file.NoSuchFileException
  • org.lukhnos.nnio.file.OpenOption
  • org.lukhnos.nnio.file.Path
  • org.lukhnos.nnio.file.PathMatcher
  • org.lukhnos.nnio.file.Paths
  • org.lukhnos.nnio.file.ProviderMismatchException
  • org.lukhnos.nnio.file.SimpleFileVisitor
  • org.lukhnos.nnio.file.spi.FileSystemProvider
  • org.lukhnos.nnio.file.StandardCopyOption
  • org.lukhnos.nnio.file.StandardOpenOption
  • org.lukhnos.nnio.file.WatchEvent
  • org.lukhnos.nnio.file.WatchKey
  • org.lukhnos.nnio.file.WatchService

A sepearte util class, org.lukhnos.nnio.channels.utils.FileChannelUtils, is provided to supply the stand-in for, which is often not available in the environments that nnio intends to support.

Note on Testing

The tests use NIO.2, but during the compile time, a Gradle task generates a version of the tests that have all java.nio.file imports substituted to org.lukhnos.nnio.file (and similarly for java.nio.channels), and each test file has a corresponding Generated- prefixed test. Both versions are built and tested together.