遇到了FILE.renameTo跨文件系统移动文件失败的问题,应使用FILES.move()接口或在同一文件系统移动文件。
FILE.renameTo接口说明:
public boolean renameTo(File dest)
Renames the file denoted by this abstract pathname.
Many aspects of the behavior of this method are inherently platform-dependent: The rename operation might not be able to move a file from one filesystem to another, it might not be atomic, and it might not succeed if a file with the destination abstract pathname already exists. The return value should always be checked to make sure that the rename operation was successful.
Note that the Files
class defines the move
method to move or rename a file in a platform independent manner.
- Parameters:
dest
- The new abstract pathname for the named file- Returns:
true
if and only if the renaming succeeded;false
otherwise- Throws:
SecurityException
- If a security manager exists and its
method denies write access to either the old or new pathnamesSecurityManager.checkWrite(java.lang.String)
NullPointerException
- If parameterdest
isnull
Files.move接口说明:
-
public static Path move(Path source, Path target, CopyOption... options) throws IOException
Move or rename a file to a target file.
By default, this method attempts to move the file to the target file, failing if the target file exists except if the source and target are the
same
file, in which case this method has no effect. If the file is a symbolic link then the symbolic link itself, not the target of the link, is moved. This method may be invoked to move an empty directory. In some implementations a directory has entries for special files or links that are created when the directory is created. In such implementations a directory is considered empty when only the special entries exist. When invoked to move a directory that is not empty then the directory is moved if it does not require moving the entries in the directory. For example, renaming a directory on the sameFileStore
will usually not require moving the entries in the directory. When moving a directory requires that its entries be moved then this method fails (by throwing anIOException
). To move a file tree may involve copying rather than moving directories and this can be done using thecopy
method in conjunction with theFiles.walkFileTree
utility method.The
options
parameter may include any of the following:Option Description REPLACE_EXISTING
If the target file exists, then the target file is replaced if it is not a non-empty directory. If the target file exists and is a symbolic link, then the symbolic link itself, not the target of the link, is replaced. ATOMIC_MOVE
The move is performed as an atomic file system operation and all other options are ignored. If the target file exists then it is implementation specific if the existing file is replaced or this method fails by throwing an IOException
. If the move cannot be performed as an atomic file system operation thenAtomicMoveNotSupportedException
is thrown. This can arise, for example, when the target location is on a differentFileStore
and would require that the file be copied, or target location is associated with a different provider to this object.An implementation of this interface may support additional implementation specific options.
Where the move requires that the file be copied then the
last-modified-time
is copied to the new file. An implementation may also attempt to copy other file attributes but is not required to fail if the file attributes cannot be copied. When the move is performed as a non-atomic operation, and aIOException
is thrown, then the state of the files is not defined. The original file and the target file may both exist, the target file may be incomplete or some of its file attributes may not been copied from the original file.Usage Examples: Suppose we want to rename a file to "newname", keeping the file in the same directory:
Path source = ... Files.move(source, source.resolveSibling("newname"));
Alternatively, suppose we want to move a file to new directory, keeping the same file name, and replacing any existing file of that name in the directory:
Path source = ... Path newdir = ... Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);
- Parameters:
source
- the path to the file to movetarget
- the path to the target file (may be associated with a different provider to the source path)options
- options specifying how the move should be done- Returns:
- the path to the target file
- Throws:
UnsupportedOperationException
- if the array contains a copy option that is not supportedFileAlreadyExistsException
- if the target file exists but cannot be replaced because theREPLACE_EXISTING
option is not specified (optional specific exception)DirectoryNotEmptyException
- theREPLACE_EXISTING
option is specified but the file cannot be replaced because it is a non-empty directory (optional specific exception)AtomicMoveNotSupportedException
- if the options array contains theATOMIC_MOVE
option but the file cannot be moved as an atomic file system operation.IOException
- if an I/O error occursSecurityException
- In the case of the default provider, and a security manager is installed, thecheckWrite
method is invoked to check write access to both the source and target file.
原文地址:https://www.cnblogs.com/cloudwind2011/p/9525288.html