首页 > 解决方案 > 使用 java.nio 移动文件时出现问题

问题描述

在重命名文件后尝试移动文件时遇到异常,问题是它间歇性地发生,即有时代码有效,有时代码无效且不可复制,如果有人可以提供有关相同的见解,将会很有帮助

Caused by: java.nio.file.AccessDeniedException: /data/Inprocess/DEMO.20191026.csv -> /data/Inprocess/DEMO.20191026.csv.inprogress
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:457)
    at sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:262)
    at java.nio.file.Files.move(Files.java:1395)

Path fromPath = inputFile.toPath();
Path toPath = new File(inputFile.getAbsolutePath() + ".inprogress").toPath();
LOGGER.info("Moving file to Path: " + inputFile.getAbsolutePath() + ".inprogress");
try {
    Files.move(fromPath, fromPath.resolveSibling(toPath),StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
    // Handle Exception
    throw new TradeProcessorException("Error while marking file Inprogress: ", e);
}

标签: javanio

解决方案


File旧的(纯磁盘文件/目录)和更新的、更强大的之间的一个区别Path是,后者维护其“文件”系统(可以是 zip、ram 磁盘、远程磁盘)。因此,一旦使用 Path,请继续使用它。

Path fromPath = inputFile.toPath();
String toName = inputFile.getFileName().toString() + ".inprogress";
Path toPath = inputFile.resolveSibling(toName);

LOGGER.info("Moving file to Path: " + toPath);
try {
    Files.move(fromPath, toPath, StandardCopyOption.REPLACE_EXISTING);

您对 resolveSibling 的使用似乎添加了完整路径。

(以上多余的只是一个返回a.toString()的提醒。)getFileName()Path


推荐阅读