Interoperability With Legacy Code
Prior to the JDK7 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 thejava.nio.file.Path
functionality with minimal impact to your code.The
java.io.File
class provides thetoPath
method, which converts an old styleFile
instance to ajava.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
Path.delete
method, as follows:Path fp = file.toPath(); fp.delete();
Mapping java.io.File Functionality to java.nio.file
Because the Java implementation of file I/O has been completely re-architected in the JDK7 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 theFile.toPath
method as suggested in the previous section. However, if you don't 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 thejava.nio.file
API and tells you where you can obtain more information.
java.io.File Functionality java.nio.file Functionality Tutorial Coverage java.io.File
java.nio.file.Path
The Path Class java.io.RandomAccessFile
The SeekableByteChannel
functionality.Random Access Files File.canRead
,canWrite
,canExecute
The Path.checkAccess
method.
On UNIX file systems, the File Attributes package is used to check the nine file permissions.Checking a File or Directory ( checkAccess
)
Managing Metadata (File Attributes)The File
methods:isDirectory
,isFile
,setExecutable
,setReadable
,setReadOnly
,lastModified
,setLastModified
,length
,setWritable
These methods that access attributes individually are replaced by the java.nio.file.attributes
package, which reads the attributes in a more efficient bulk operation.Managing Metadata File.renameTo
Path.moveTo
Moving a File or Directory File.delete
Path.delete
orPath.delete(boolean)
Deleting a File or Directory File.createNewFile
Path.createFile
Creating Files File.deleteOnExit
Replaced by the DELETE_ON_CLOSE
option specified in thecreateFile
method.Creating Files File.createTempFile
There is no special-purpose method in the Path
class for creating temporary files, but this can easily be accomplished by using theDELETE_ON_CLOSE
option with thecreateFile
method. (ThePath.newOutputStream
andPath.newByteChannel
methods also support theDELETE_ON_CLOSE
option.)An easy way to create a temporary file in the new API follows:
Path tmpFile = File.createTempFile("blah",null).toPath();Creating Files
Creating and Writing a File by Using Stream I/O
Reading and Writing Files by Using Channel I/OFile.exists
Path.exists
andPath.notExists
Verifying the Existence of a File or Directory File.compareTo
andequals
Path.compareTo
andequals
Comparing Two Paths File.getAbsolutePath
andgetAbsoluteFile
Path.toAbsolutePath
Converting a Path File.getCanonicalPath
andgetCanonicalFile
Path.toRealPath
ornormalize
Converting a Path ( toRealPath
)
Removing Redundancies From a Path (normalize
)
File.toURI
Path.toURI
Converting a Path File.isHidden
Path.isHidden
Retrieving Information About the Path File.list
andlistFiles
Path.newDirectoryStream
Listing a Directory's Contents File.mkdir
andmkdirs
Path.createDirectory
Creating a Directory File.listRoots
FileSystem.getRootDirectories
Listing a File System's Root Directories File.getTotalSpace
,File.getFreeSpace
,File.getUsableSpace
Attributes.readFileStoreSpaceAttributes
File Store Attributes