Просто зробіть це (і приберіть за собою)
Можливим підходом може бути спроба створити файл і врешті видалити його, якщо створення вдалося, але я сподіваюся, що є більш елегантний спосіб досягнення того ж результату.
Можливо, це найнадійніший спосіб.
Нижче це canCreateOrIsWritable
визначає, чи здатна ваша програма створити файл та його батьківські каталоги за заданим шляхом, або, якщо там уже є файл, написати на нього.
Це робиться, фактично створюючи необхідні батьківські каталоги, а також порожній файл у шляху. Потім він видаляє їх (якщо на шляху існував файл, він залишається в спокої).
Ось як ви можете ним скористатися:
var myFile = new File("/home/me/maybe/write/here.log")
if (canCreateOrIsWritable(myFile)) {
createParents(myFile);
appendOrCreate(myFile, "new content");
} else {
var tempDir = System.getProperty("java.io.tmpdir");
var alternative = Paths.get(tempDir, "second_choice.log");
appendOrCreate(alternative, "new content in temporary directory");
}
Основний метод з кількома допоміжними методами:
static boolean canCreateOrIsWritable(File file) {
boolean canCreateOrIsWritable;
List<File> parentDirsToCreate = getParentDirsToCreate(file);
reverse(parentDirsToCreate).forEach(File::mkdir);
try {
boolean wasCreated = file.createNewFile();
if (wasCreated) {
canCreateOrIsWritable = true;
file.delete();
parentDirsToCreate.forEach(File::delete);
} else {
canCreateOrIsWritable = java.nio.file.Files.isWritable(file.toPath());
}
} catch (IOException e) {
canCreateOrIsWritable = false;
}
return canCreateOrIsWritable;
}
static List<File> getParentDirsToCreate(File file) {
var parentsToCreate = new ArrayList<File>();
File parent = file.getParentFile();
while (parent != null && !parent.exists()) {
parentsToCreate.add(parent);
parent = parent.getParentFile();
}
return parentsToCreate;
}
static <T> List<T> reverse(List<T> input) {
var reversed = new ArrayList<T>();
for (int i = input.size() - 1; i >= 0; i--) {
reversed.add(input.get(i));
}
return reversed;
}
static void createParents(File file) {
File parent = file.getParentFile();
if (parent != null) {
parent.mkdirs();
}
}
Майте на увазі, що між викликом canCreateOrIsWritable
та створенням фактичного файлу вміст та дозволи вашої файлової системи могли змінитися.