Java FileOutputStream Создать файл, если он не существует

Есть ли способ использовать FileOutputStream таким образом, чтобы, если файл (String filename) не существует, он его создаст?

FileOutputStream oFile = new FileOutputStream("score.txt", false);

person Stefan Dunn    schedule 08.03.2012    source источник


Ответы (9)


Он выдаст FileNotFoundException, если файл не существует и не может быть создан (doc), но он создаст его, если сможет. Чтобы быть уверенным, вам, вероятно, следует сначала проверить, существует ли файл, прежде чем вы создадите FileOutputStream (и создайте с помощью createNewFile(), если это не так):

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 
person talnicolas    schedule 08.03.2012
comment
Если файл не существует, как мне создать пустой файл .txt? - person Stefan Dunn; 08.03.2012
comment
@StefanDunn с методом createNewFile(), как показано в моем примере. - person talnicolas; 08.03.2012
comment
Условие является избыточным. Согласно JavaDoc, createNewFile() атомарно проверяет наличие файла. - person aztek; 02.10.2012
comment
@aztek, наверное, можно было бы оставить условие для улучшения читабельности кода - person Andrii Chernenko; 07.04.2013
comment
@ marcv81 Излишний доступ к файловой системе может значительно замедлить допустимые сценарии использования java, например, при попытке доступа к сетевому диску. Это также вызывает состояние гонки, поэтому вы не можете гарантировать, что файл не существует к тому моменту, когда вы начнете писать в него. По обеим этим причинам это не рекомендуется. Если хотите помочь читателю, оставьте комментарий. - person Robino; 25.10.2017
comment
@Robino, вы правы относительно состояния гонки. Мой комментарий был только в ответ на JopVernooij, который беспокоился о производительности. Но я полагаю, что насчет производительности вы тоже правы :) - person marcv81; 26.10.2017
comment
Для чего нужна 2-я линия? Созданный файл можно удалить между 2-й и 3-й строкой. - person pikachu0; 14.02.2018
comment
createNewFile() - здесь пустая трата времени. Система уже сделает это. Вы просто заставляете его смотреть дважды. - person user207421; 15.02.2019
comment
Просто узнайте, что файл будет создан при записи, что необходимо, это создать каталог, если он отсутствует. Для этого воспользуйтесь методом «Константин Медведь». - person KGhatak; 29.09.2019
comment
выбрасывает java.io.IOException: нет такого файла или каталога - person Serhii Ostrovskiy; 03.03.2020
comment
используйте yourFile.getParentFile().mkdirs() перед yourFile.createNewFile();, если вы также создаете каталоги. - person Bruno Bieri; 05.09.2020
comment
@Bruno Используйте его вместо вместо createNewFile(), что здесь излишне и расточительно. - person user207421; 18.06.2021

Перед созданием файла необходимо создать все родительские каталоги.

Используйте 1_

Обновление: создавайте все родительские папки только тогда, когда их нет. В противном случае в этом нет необходимости.

person Kostiantyn Medvid    schedule 04.09.2015
comment
В этом нет необходимости или необходимости, как вы писали изначально. Только если их еще нет. - person user207421; 18.06.2021

Вы можете создать пустой файл независимо от того, существует он или нет ...

new FileOutputStream("score.txt", false).close();

если вы хотите оставить файл, если он существует ...

new FileOutputStream("score.txt", true).close();

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

person Peter Lawrey    schedule 08.03.2012
comment
Он выбрасывает FileNotFoundException в обоих случаях. - person mixel; 28.10.2014
comment
@mixel Итак, каталог не существует ... - person user207421; 18.06.2021

File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

Передайте этот f своему FileOutputStream конструктору.

person Shashank Kadne    schedule 08.03.2012
comment
Здесь состояние гонки ... Лучше сделать это так: File f = new File (Test.txt); if (! f.createNewFile ()) {System.out.println (Файл уже существует); } - person humanity; 22.03.2019
comment
Это пустая трата времени. new FileOutputStream(...) уже делает это, и теперь вы заставляете его удалить и созданный здесь файл. - person user207421; 18.06.2021

FileUtils from apache commons - довольно хороший способ добиться этого в одной строке.

FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))

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

File file = new File("/home/nikhil/somedir/file.txt");
file.getParentFile().mkdirs(); // Will create parent directories if not exists
file.createNewFile();
FileOutputStream s = new FileOutputStream(file,false);

Все вышеуказанные операции вызовут исключение, если текущему пользователю не разрешено выполнять операцию.

person Nikhil Sahu    schedule 09.07.2016

Создайте файл, если он не существует. Если файл закрывается, очистите его содержимое:

/**
 * Create file if not exist.
 *
 * @param path For example: "D:\foo.xml"
 */
public static void createFile(String path) {
    try {
        File file = new File(path);
        if (!file.exists()) {
            file.createNewFile();
        } else {
            FileOutputStream writer = new FileOutputStream(path);
            writer.write(("").getBytes());
            writer.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
person Do Nhu Vy    schedule 19.08.2016
comment
Это пустая трата времени. new FileOutputStream(...) уже делает это, и теперь вы заставляете его удалить и созданный здесь файл. - person user207421; 18.06.2021

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

Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
    Files.createFile(path);
Files.write(path, ("").getBytes());
person Manish Bansal    schedule 14.02.2018
comment
Это пустая трата времени. new FileOutputStream(...) уже делает это, и теперь вы заставляете его удалить и созданный здесь файл. - person user207421; 18.06.2021

Вы можете потенциально получить FileNotFoundException, если файл не существует.

В документации Java говорится:

Доступен ли файл или может ли он быть создан, зависит от базовой платформы http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

Если вы используете Java 7, вы можете использовать пакет java.nio:

Параметр options указывает, как файл создается или открывается ... он открывает файл для записи, создавая файл, если он не существует ...

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html

person sikander    schedule 08.03.2012

new FileOutputStream(f) в большинстве случаев создает файл, но, к сожалению, вы получите исключение FileNotFoundException.

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

из Javadoc < / а>

Другими словами, может быть множество случаев, когда вы получите FileNotFoundException, означающее «Не удалось создать ваш файл», но вы не сможете найти причину, по которой создание файла не удалось.

Решение состоит в том, чтобы удалить любой вызов File API и использовать вместо него Files API, поскольку он обеспечивает гораздо лучшую обработку ошибок. Обычно заменяйте любой new FileOutputStream(f) на Files.newOutputStream(p).

В случаях, когда вам действительно нужно использовать File API (потому что вы используете внешний интерфейс, например, File), использование Files.createFile(p) - хороший способ убедиться, что ваш файл создан правильно, и если нет, вы узнаете, почему он не работает . Некоторые люди выше отметили, что это избыточно. Это правда, но вы получаете лучшую обработку ошибок, которая может потребоваться в некоторых случаях.

person stackoverflowed    schedule 09.02.2019
comment
Files.newOutputStream() не имеет лучшей обработки ошибок, чем new FileOutputStream. если вы считаете иначе, пожалуйста, подтвердите свое утверждение. - person user207421; 18.06.2021
comment
Ха-ха, я мог бы вернуть его вам: пожалуйста, подтвердите свое утверждение. - person stackoverflowed; 19.06.2021