File.createNewFile() thowing IOException Нет такого файла или каталога
У меня есть метод, который записывает в файл журнала. Если файл существует, он должен быть добавлен к нему, если нет, то я хочу, чтобы он создавал новый файл.
if (!file.exists() && !file.createNewFile()) {
System.err.println("Error with output file: " + outFile
+ "\nCannot create new file.");
continue;
}
У меня есть это, чтобы проверить, что файл может быть создан. file - объект java.io.File. createNewFile бросает исключение IOException: нет такого файла или каталога. Этот метод работает отлично, так как я написал его несколько недель назад и только недавно начал делать это, хотя я не знаю, что я мог бы изменить. Я проверил, каталог существует, и у меня есть права на запись для него, но потом я подумал, что он должен просто вернуть false, если он не может сделать файл по какой-либо причине.
Есть ли что-то, что мне не хватает, чтобы заставить это работать?
Ответы
Ответ 1
Обычно это то, что вы недавно изменили, сначала с вашего образца кода, если файл не существует, а не создает новый файл - вы пытаетесь что-то закодировать - что это такое?
Затем просмотрите список каталогов, чтобы узнать, существует ли он на самом деле, и выполните println/toString() в объекте file и getMessage() для исключения, а также трассировку стека печати.
Затем, начните с нуля знания снова и повторите шаг за шагом каждый шаг, который вы используете, чтобы попасть сюда. Вероятно, вы застряли там где-то, концептуализируясь в коде (потому что он работал) - вы просто проследите каждый шаг в деталях, вы его найдете.
Ответ 2
попробуйте обеспечить родительский каталог с помощью:
file.getParentFile().mkdirs()
Ответ 3
Возможно, каталог, в котором создается файл, не существует?
Ответ 4
В соответствии с [java docs] (http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createNewFile()) createNewFile
создаст для вас новый файл.
Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist.
Учитывая, что createNewFile
является атомарным и не будет переписывать существующий файл, вы можете переписать свой код как
try {
if(!file.createNewFile()) {
System.out.println("File already exists");
}
} catch (IOException ex) {
System.out.println(ex);
}
Это может сделать любые потенциальные проблемы с потоками, условиями гонки и т.д. легче определить.
Ответ 5
Я думаю, что исключение, которое вы получаете, вероятно, является результатом проверки файла атомного метода file.createNewFile()
. Метод не может проверить, существует ли файл, потому что некоторые из родительских каталогов не существуют или у вас нет прав доступа к ним. Я бы предложил следующее:
if (file.getParentFile() != null && !file.getParentFile().mkDirs()) {
// handle permission problems here
}
// either no parent directories there or we have created missing directories
if (file.createNewFile() || file.isFile()) {
// ready to write your content
} else {
// handle directory here
}
Если вы учитываете concurrency, все эти проверки бесполезны, потому что в любом случае какой-либо другой поток может создавать, удалять или делать что-либо еще с вашим файлом. В этом случае вы должны использовать блокировки файлов, которые я бы не предложил делать;)
Ответ 6
Вы, безусловно, получаете это исключение
"Система не может найти указанный путь"
Просто напечатайте файл file.getAbsoluteFile(), это даст вам знать, какой файл вы хотите создать.
Это исключение произойдет, если каталог, в котором вы создаете файл, не существует.
Ответ 7
Это может быть проблема (проверка и создание вместе не являются атомарными: !file.exists() && !file.createNewFile()
), а "файл" уже является каталогом.
Попробуйте (file.isFile()
):
if (file.exists() && !file.isFile()){
//handle directory is there
}else if(!file.createNewFile()) {
//as before
}
Ответ 8
В моем случае было просто отсутствие разрешения:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Ответ 9
Проблема, с которой я столкнулся, заключается в том, что в имени моего файла содержался символ косой черты "/", поэтому текст перед косой чертой считался каталогом, а не началом имени файла.