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... */
}
應該適用于常規文件和文件夾。
添加回答
舉報