File.createNewFile () thowing IOException Нет такого файла или каталога - PullRequest
30 голосов
/ 06 октября 2009

У меня есть метод, который пишет в файл журнала. Если файл существует, он должен добавить его, если нет, то я хочу, чтобы он создал новый файл.

if (!file.exists() && !file.createNewFile()) {
    System.err.println("Error with output file: " + outFile
        + "\nCannot create new file.");
    continue;
}

У меня есть это, чтобы проверить, что файл может быть создан. файл является объектом java.io.File. createNewFile вызывает IOException: нет такого файла или каталога. Этот метод работал отлично с тех пор, как я написал его несколько недель назад, и только недавно начал делать это, хотя я не знаю, что я мог бы изменить. Я проверил, каталог существует и у меня есть права на запись для него, но потом я подумал, что он должен просто вернуть false, если не может создать файл по любой причине.

Есть что-то, чего мне не хватает, чтобы заставить это работать?

Ответы [ 8 ]

98 голосов
/ 06 октября 2009

убедитесь, что родительский каталог существует с:

file.getParentFile().mkdirs()
12 голосов
/ 06 октября 2009

Возможно, каталог, в котором создается файл, не существует?

7 голосов
/ 06 октября 2009

обычно это то, что вы недавно изменили, прежде всего ваш пример кода, если файл не существует и не создает новый файл - вы пытаетесь что-то кодировать - что это такое?

Затем посмотрите на список каталогов, чтобы увидеть, существует ли он на самом деле, и выполните println / toString () для объекта file и getMessage () для исключения, а также трассировку стека печати. ​​

Затем начните снова с нуля знаний и пересчитывайте с начала каждого шага, который вы используете, чтобы попасть сюда. Наверное, ты где-то застрял во время концептуализации в коде (потому что он работал) - просто детально проследи каждый шаг и найдешь его.

3 голосов
/ 06 октября 2009

Я думаю, что исключение, которое вы получите, вероятно, является результатом проверки файла атомарного метода 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
}

Если принять во внимание параллелизм, все эти проверки бесполезны, потому что в любом случае какой-то другой поток может создавать, удалять или делать что-либо еще с вашим файлом. В этом случае вы должны использовать блокировки файлов, которые я бы не советовал делать;)

3 голосов
/ 06 октября 2009

Согласно [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);
}

Это может упростить обнаружение любых потенциальных проблем с потоками, условий гонки и т. Д.

2 голосов
/ 06 октября 2009

Вы, безусловно, получаете это исключение 'Системе не удается найти указанный путь'

Просто напечатайте 'file.getAbsoluteFile ()', это позволит вам узнать, какой файл вы хотите создать.

Это исключение произойдет, если каталог, в котором вы создаете файл, не существует .

0 голосов
/ 03 октября 2016

В моем случае было просто отсутствие разрешения:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

0 голосов
/ 06 октября 2009

Это может быть проблема с потоками (проверка и создание вместе не являются атомарными: !file.exists() && !file.createNewFile()), или "файл" уже является каталогом .

Попробуйте (file.isFile()):

if (file.exists() && !file.isFile()){
   //handle directory is there
}else if(!file.createNewFile()) {
   //as before
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...