Interoperability with Legacy Code
Prior to JDK7, 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 get a useful error message. For example, if a file delete 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 would recursively walk a file tree and do the right thing 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 that converts an old styleFile
instance to ajava.nio.file.Path
instance:Path input = file.toPath();You can then take advantage of the rich feature set available to the
Path
class.For example, say you had a some code that deleted a file:
file.delete();You can modify this code to use the
Path.delete
method like this:Path fp = file.toPath(); fp.delete();That's all you need to do!
Mapping java.io.File Functionality to java.nio.file
Because the Java implementation of file I/O has been completely re-architected in JDK7, you can't simply swap one method for another. 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 re-write your file I/O code.There is no one-to-one correspondence between the two, 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 get 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 to thecreateFile
method.Creating Files File.createTempFile
There is no special-purpose method in the Path
class for creating temp files, but this can easily be accomplished using theDELETE_ON_CLOSE
flag with thecreateFile
method. (ThePath.newOutputStream
andPath.newByteChannel
methods also support theDELETE_ON_CLOSE
option.)An easy way to create a temp file in the new API:
Path tmpFile = File.createTempFile("blah",null).toPath();Creating Files
Creating and Writing a File using Stream I/O
Reading and Writing Files using Channel I/OFile.exists
Path.exists
andPath.notExists
Verifying the Existence of a File or Directory File.compareTo
andequals
Path.compareTo
andequals
Comparing a Path File.getAbsolutePath
andgetAbsoluteFile
Path.toAbsolutePath
Converting the Path File.getCanonicalPath
andgetCanonicalFile
Path.toRealPath
ornormalize
Converting the Path ( toRealPath
)
Removing Redundancies from a Path (normalize
)
File.toURI
Path.toURI
Converting the 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