Interoperability with Legacy Code
Prior to JDK7, 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 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
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 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.Fileand would like to take advantage of thejava.nio.file.Pathfunctionality with minimal impact to your code.The
java.io.Fileclass provides thetoPathmethod that converts an old styleFileinstance to ajava.nio.file.Pathinstance:Path input = file.toPath();You can then take advantage of the rich feature set available to the
Pathclass.For example, say you had a some code that deleted a file:
file.delete();You can modify this code to use the
Path.deletemethod 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.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 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.FileAPI maps to in thejava.nio.fileAPI and tells you where you can get 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 to thecreateFilemethod.Creating Files File.createTempFileThere is no special-purpose method in the Pathclass for creating temp files, but this can easily be accomplished using theDELETE_ON_CLOSEflag with thecreateFilemethod. (ThePath.newOutputStreamandPath.newByteChannelmethods also support theDELETE_ON_CLOSEoption.)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.existsPath.existsandPath.notExistsVerifying the Existence of a File or Directory File.compareToandequalsPath.compareToandequalsComparing a Path File.getAbsolutePathandgetAbsoluteFilePath.toAbsolutePathConverting the Path File.getCanonicalPathandgetCanonicalFilePath.toRealPathornormalizeConverting the Path ( toRealPath)
Removing Redundancies from a Path (normalize)
File.toURIPath.toURIConverting the 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