3 回答
TA贡献1813条经验 获得超2个赞
我建议您使用 SimpleFileVistor 类而不是编写代码来遍历目录。
在 Files 类中已经有内置的方法来遍历目录。
Files.walkFileTree(path, MyFileVisitor)
您可以创建一个客户访问者类,如
public class MyFileVisitor extends SimpleFileVisitor<Path>{
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
System.out.println("Visit the File")
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc)
throws IOException {
System.out.println("File Visit Failed")
return FileVisitResult.CONTINUE;
}
}
这可以提高您的代码可读性并且不那么冗长。
TA贡献1785条经验 获得超8个赞
检查目录中的每个文件让我觉得很慢并且容易出现竞争条件。在您的示例中,您会立即获得目录中的文件列表,然后对每个文件进行测试;同时,创建者线程可能仍在添加文件。即使列表中的每个文件都可以访问,创建者也可能没有完成目录的写入。
它有点老派,不是很花哨,但我会在创建过程中使用临时目录名称,或者将锁定文件写为第一个文件,并在创建者完成后将其删除。
在第一种情况下:
String baseDirectory = "{whatever}";
String workDirectory = "workDirectory" + counter;
Path tempPath = FileSystems.getDefault().getPath(baseDirectory, ".temp_" + workDirectory);
Path workPath = FileSystems.getDefault().getPath(baseDirectory, workDirectory);
Files.createDirectory(tempPath);
// Write the contents of the directory.
// [...]
Files.move(tempPath, workPath, CopyOptions.ATOMIC_MOVE);
在第二种情况下:
String baseDirectory = "{whatever}";
String workDirectory = "workDirectory" + counter;
Path workPath = FileSystems.getDefault().getPath(baseDirectory, workDirectory);
Files.createDirectory(workPath);
Path lockFile = workPath.resolve("LOCKFILE");
Files.createFile(lockFile);
// Write the contents of the directory.
// [...]
Files.delete(lockFile);
这两种情况的想法是,创建者任务在完成创建目录时明确发出信号。如果您只是等待操作暂停,它可能只是在等待通过网络加载大缓冲区。
TA贡献1869条经验 获得超4个赞
我认为最简单的方法是使用Files类及其is*方法,如isReadableand isWritable。
if (Files.isReadable(new File(filepath).toPath()) &&
Files.isWritable(new File(filepath).toPath()))
{
/* do something... */
}
应该适用于常规文件和文件夹。
添加回答
举报