Interoperability With Legacy Code
Prior to the JDK7 release, the
java.io.Fileclass 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
renamemethod 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
Filemethods 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.Fileand would like to take advantage of thejava.nio.file.Pathfunctionality with minimal impact to your code.The
java.io.Fileclass provides thetoPathmethod, which converts an old styleFileinstance to ajava.nio.file.Pathinstance, as follows:Path input = file.toPath();You can then take advantage of the rich feature set available to the
Pathclass.For example, assume you had some code that deleted a file:
file.delete();You could modify this code to use the
Path.deletemethod, 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.filepackage, your easiest solution is to use theFile.toPathmethod 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.FileAPI maps to in thejava.nio.fileAPI and tells you where you can obtain more information.
java.io.File Functionality java.nio.file Functionality Tutorial Coverage java.io.Filejava.nio.file.PathThe Path Class java.io.RandomAccessFileThe SeekableByteChannelfunctionality.Random Access Files File.canRead,canWrite,canExecuteThe Path.checkAccessmethod.
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 Filemethods:isDirectory,isFile,setExecutable,setReadable,setReadOnly,lastModified,setLastModified,length,setWritableThese methods that access attributes individually are replaced by the java.nio.file.attributespackage, which reads the attributes in a more efficient bulk operation.Managing Metadata File.renameToPath.moveToMoving a File or Directory File.deletePath.deleteorPath.delete(boolean)Deleting a File or Directory File.createNewFilePath.createFileCreating Files File.deleteOnExitReplaced by the DELETE_ON_CLOSEoption specified in thecreateFilemethod.Creating Files File.createTempFileThere is no special-purpose method in the Pathclass for creating temporary files, but this can easily be accomplished by using theDELETE_ON_CLOSEoption with thecreateFilemethod. (ThePath.newOutputStreamandPath.newByteChannelmethods also support theDELETE_ON_CLOSEoption.)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.existsPath.existsandPath.notExistsVerifying the Existence of a File or Directory File.compareToandequalsPath.compareToandequalsComparing Two Paths File.getAbsolutePathandgetAbsoluteFilePath.toAbsolutePathConverting a Path File.getCanonicalPathandgetCanonicalFilePath.toRealPathornormalizeConverting a Path ( toRealPath)
Removing Redundancies From a Path (normalize)
File.toURIPath.toURIConverting a Path File.isHiddenPath.isHiddenRetrieving Information About the Path File.listandlistFilesPath.newDirectoryStreamListing a Directory's Contents File.mkdirandmkdirsPath.createDirectoryCreating a Directory File.listRootsFileSystem.getRootDirectoriesListing a File System's Root Directories File.getTotalSpace,File.getFreeSpace,File.getUsableSpaceAttributes.readFileStoreSpaceAttributesFile Store Attributes