Как создать файл в Java, только если он еще не существует? - PullRequest
9 голосов
/ 12 октября 2009

Я пытаюсь реализовать следующую операцию на Java и не знаю, как:

/*
 * write data (Data is defined in my package)
 * to a file only if it does not exist, return success
 */
boolean writeData(File f, Data d)
{
    FileOutputStream fos = null;
    try 
    {
        fos = atomicCreateFile(f);
        if (fos != null)
        {
            /* write data here */
            return true;
        }
        else
        {
            return false;
        }
    }
    finally
    {
        fos.close();  // needs to be wrapped in an exception block
    }
}

Существует ли уже функция, которую я могу использовать для atomicCreateFile()?

edit: Ой, я не уверен, что File.createNewFile () достаточно для моих нужд. Что если я позвоню f.createNewFile(), а затем между временем, когда он вернется, и я открою файл для записи, кто-то другой удалил файл? Есть ли способ, как я могу создать файл и открыть его для записи + заблокировать, все одним махом? Нужно ли беспокоиться об этом?

Ответы [ 5 ]

18 голосов
/ 12 октября 2009

File.createNewFile() создает файл, только если он еще не существует.

РЕДАКТИРОВАТЬ: на основе вашего нового описания желания заблокировать файл после его создания, вы можете использовать объект java.nio.channels.FileLock для блокировки файла. Там нет ни одной строки создать и заблокировать, хотя, как вы надеетесь. Также см. Этот вопрос SO .

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

File.createNewFile ()

Атомно создает новый пустой файл с именем с этим абстрактным путем тогда и только тогда, когда файл с таким именем еще не существует . Проверка существования файла и создание файла, если он не существует, - это отдельная операция, которая является атомарной по отношению ко всем другим действиям файловой системы, которые могут повлиять на файл.

EDIT

Джейсон, что касается твоей заботы, если ты продолжишь читать ссылку, которую мы тебе послали, есть ПРИМЕЧАНИЕ об этом.

Примечание: этот метод не должен использоваться для блокировки файлов, поскольку результирующий протокол не может работать надежно. Вместо этого следует использовать FileLock .

Я думаю, что вы действительно должны прочитать эту часть:

alt

2 голосов
/ 26 марта 2016

версия Java 7 с файлами # createFile :

Path out;

try {
    out = Files.createFile(Paths.get("my-file.txt"));
} catch (FileAlreadyExistsException faee) {
    out = Paths.get("my-file.txt");
}
0 голосов
/ 08 марта 2015
//myFile should only be created using this method to ensure thread safety
public synchronized File getMyFile(){
  File file = new File("path/to/myfile.ext");
  if(!file.exists()){
     file.getParentFile().mkdirs();
     file.createNewFile();
  }
  return file;
}  
0 голосов
/ 12 октября 2009

Почему вы не можете проверить, используя Файл # существует ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...