Java FileOutputStream Create File, если не существует


192

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

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

Ответы:


315

Он выдаст a, 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); 

2
Если файл не существует, как мне создать пустой файл .txt?
Стефан Данн

3
@StefanDunn с помощью createNewFile()метода, как показано в моем примере.
talnicolas

56
Условие является избыточным. Согласно JavaDoc , createNewFile()сам атомарно проверяет наличие файла.
aztek 02

8
@aztek, наверное, можно было бы оставить условие для улучшения читабельности кода
Андрей Черненко

3
createNewFile()здесь пустая трата времени. Система уже сделает это. Вы просто заставляете его смотреть дважды.
Marquis of Lorne


23

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

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

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

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

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


3
Выкидывает FileNotFoundExceptionв обоих случаях.
mixel

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

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


3
Здесь состояние гонки ... Лучше сделать это так: File f = new File ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("Файл уже существует"); }
humanity

21

FileUtils от 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);

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


4

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

/**
 * 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();
    }
}

2

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

Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
    Files.createFile(path);
Files.write(path, ("").getBytes());

0

Вы можете потенциально получить, 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


0

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

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

из Javadoc

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.