aga*_*aga 7 java java.nio.file
我想删除一个文件并使用旧文件重命名另一个文件,但我无法移动此文件,因为java正在抛出java.nio.file.FileAlreadyExistsException以下是我正在使用的代码片段
static void swapData(String origFilePath, String tempFilePath) throws IOException{
Path tempPath = FileSystems.getDefault().getPath(tempFilePath);
Path origPath = FileSystems.getDefault().getPath(origFilePath);
try{
String origFileName = null;
File origFileRef = new File(origFilePath);
if(Files.exists(origPath)){
origFileName = origFileRef.getName();
Files.delete(origPath);
if(Files.exists(origPath))
throw new IOException("cannot able to delete original file");
}
if(origFileName != null)
Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING);
}catch(IOException e){
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我收到的例外
上 Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING);
此外,当我在Windows资源管理器中看到此文件时,其缩略图存在但无法打开它.我无法理解它为什么会发生,如果我使用REPLACE_EXISTING,为什么它会抛出FileAlreadyExistsException异常.
我也编辑了上一个问题,因为它没有明确说明.
请帮忙.
Anuj
检查运行时是否有另一个线程持有相同的文件资源Files.move或Files.copy.我有相同的异常和文件访问症状,并能够在序列化文件访问后解决它.
此外,通过REPLACE_EXISTING在执行Files.copy或使用时Files.move,您不再需要编写删除原始文件的多个步骤,然后重命名tmp,尽管Files.move或Files.copy不保证原子.有一个ATOMIC_MOVE选项,但是我不喜欢特定于实现的保证,IOException如果文件已经存在,如javadoc所描述的那样可以抛出.
ATOMIC_MOVE:移动作为原子文件系统操作执行,所有其他选项都被忽略.如果目标文件存在,那么如果替换现有文件或者此方法因抛出IOException而失败,则它是特定于实现的.如果移动无法作为原子文件系统操作执行,则抛出AtomicMoveNotSupportedException.例如,当目标位置位于不同的FileStore上并且需要复制文件,或者目标位置与该对象的不同提供者相关联时,可能会出现这种情况.