Legacy File I/O Code

Interoperability With Legacy Code

Prior to the Java SE 7 release, the java.io.File class was the mechanism used for file I/O, but it had several drawbacks.

  • Many methods didn't throw exceptions when they failed, so it was impossible to obtain a useful error message. For example, if a file deletion failed, the program would receive a "delete fail" but wouldn't know if it was because the file didn't exist, the user didn't have permissions, or there was some other problem.

  • The rename method didn't work consistently across platforms.

  • There was no real support for symbolic links.

  • More support for metadata was desired, such as file permissions, file owner, and other security attributes.

  • Accessing file metadata was inefficient.

  • Many of the File methods didn't scale. Requesting a large directory listing over a server could result in a hang. Large directories could also cause memory resource problems, resulting in a denial of service.

  • It was not possible to write reliable code that could recursively walk a file tree and respond appropriately if there were circular symbolic links.

Perhaps you have legacy code that uses java.io.File and would like to take advantage of the java.nio.file.Path functionality with minimal impact to your code.

The java.io.File class provides the toPath method, which converts an old style File instance to a java.nio.file.Path instance, as follows:

Path input = file.toPath();

You can then take advantage of the rich feature set available to the Path class.

For example, assume you had some code that deleted a file:

file.delete();

You could modify this code to use the Files.delete method, as follows:

Path fp = file.toPath();
Files.delete(fp);

Conversely, the Path.toFile method constructs a java.io.File object for a Path object.

Mapping java.io.File Functionality to java.nio.file

Because the Java implementation of file I/O has been completely re-architected in the Java SE 7 release, you cannot swap one method for another method. If you want to use the rich functionality offered by the java.nio.file package, your easiest solution is to use the File.toPath method as suggested in the previous section. However, if you do not want to use that approach or it is not sufficient for your needs, you must rewrite your file I/O code.

There is no one-to-one correspondence between the two APIs, but the following table gives you a general idea of what functionality in the java.io.File API maps to in the java.nio.file API and tells you where you can obtain more information.

java.io.File Functionalityjava.nio.file FunctionalityTutorial Coverage
java.io.Filejava.nio.file.PathThe Path Class
java.io.RandomAccessFileThe SeekableByteChannel functionality.Random Access Files
File.canRead , canWrite , canExecuteFiles.isReadable , Files.isWritable , and Files.isExecutable .
On UNIX file systems, the Managing Metadata (File and File Store Attributes) package is used to check the nine file permissions.
Checking a File or Directory
Managing Metadata
File.isDirectory() , File.isFile() , and File.length()Files.isDirectory(Path, LinkOption...) , Files.isRegularFile(Path, LinkOption...) , and Files.size(Path)Managing Metadata
File.lastModified() and File.setLastModified(long)Files.getLastModifiedTime(Path, LinkOption...) and Files.setLastMOdifiedTime(Path, FileTime)Managing Metadata
The File methods that set various attributes: setExecutable , setReadable , setReadOnly , setWritableThese methods are replaced by the Files method setAttribute(Path, String, Object, LinkOption...) .Managing Metadata
new File(parent, "newfile")parent.resolve("newfile")Path Operations
File.renameToFiles.moveMoving a File or Directory
File.deleteFiles.deleteDeleting a File or Directory
File.createNewFileFiles.createFileCreating Files
File.deleteOnExitReplaced by the DELETE_ON_CLOSE option specified in the createFile method.Creating Files
File.createTempFileFiles.createTempFile(Path, String, FileAttributes<?>) , Files.createTempFile(Path, String, String, FileAttributes<?>)Creating Files
Creating and Writing a File by Using Stream I/O
Reading and Writing Files by Using Channel I/O
File.existsFiles.exists and Files.notExistsVerifying the Existence of a File or Directory
File.compareTo and equalsPath.compareTo and equalsComparing Two Paths
File.getAbsolutePath and getAbsoluteFilePath.toAbsolutePathConverting a Path
File.getCanonicalPath and getCanonicalFilePath.toRealPath or normalizeConverting a Path (toRealPath)
Removing Redundancies From a Path (normalize)
File.toURIPath.toURIConverting a Path
File.isHiddenFiles.isHiddenRetrieving Information About the Path
File.list and listFilesPath.newDirectoryStreamListing a Directory's Contents
File.mkdir and mkdirsPath.createDirectoryCreating a Directory
File.listRootsFileSystem.getRootDirectoriesListing a File System's Root Directories
File.getTotalSpace , File.getFreeSpace , File.getUsableSpaceFileStore.getTotalSpace , FileStore.getUnallocatedSpace , FileStore.getUsableSpace , FileStore.getTotalSpaceFile Store Attributes