203

Is there a way to use FileOutputStream in a way that if a file (String filename) does not exist, then it will create it?

FileOutputStream oFile = new FileOutputStream("score.txt", false);
Peter Lawrey
  • 498,481
  • 72
  • 700
  • 1,075
Stefan Dunn
  • 4,833
  • 7
  • 41
  • 77

9 Answers9

328

It will throw a FileNotFoundException if the file doesn't exist and cannot be created (doc), but it will create it if it can. To be sure you probably should first test that the file exists before you create the FileOutputStream (and create with createNewFile() if it doesn't):

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 
Damiano
  • 942
  • 2
  • 10
  • 22
talnicolas
  • 13,011
  • 6
  • 33
  • 55
  • 2
    if the file does not exist, how would I create an empty .txt file? – Stefan Dunn Mar 08 '12 at 16:09
  • 3
    @StefanDunn with the `createNewFile()` method, as shown in my example. – talnicolas Mar 08 '12 at 16:12
  • 58
    The condition is redundant. According to [JavaDoc](http://docs.oracle.com/javase/1.4.2/docs/api/java/io/File.html#createNewFile%28%29), `createNewFile()` itself atomically checks the existence of the file. – aztek Oct 02 '12 at 10:11
  • 8
    @aztek probably we could leave the condition to improve code readability – Andrii Chernenko Apr 06 '13 at 20:13
  • 1
    @marcv81 Needless file system access can slow down legitimate java use cases significantly, for example when trying to access a network drive. It also causes a race condition, so you can't guarantee the file doesn't exists by the time you come to writing to it. For both these reasons, it is not advised. If you want to help the reader, leave a comment. – Robino Oct 25 '17 at 13:39
  • 1
    @Robino, you are correct about the race condition. My comment was only in response to JopVernooij who was concerned about performance. But I suppose you are also right about performance anyway :) – marcv81 Oct 26 '17 at 14:12
  • What is the purpose of the 2nd line? The created file may be deleted between the 2nd line and 3rd line. – pikachu0 Feb 14 '18 at 07:12
  • 3
    `createNewFile()` is a total waste of time here. The system will already do that. You're just forcing it to look twice. – user207421 Feb 15 '19 at 07:25
  • Just find out that a file will be created on write, what is needed is to create the dir if not present. For that use 'Kostiantyn Medvid' method. – KGhatak Sep 29 '19 at 04:24
  • throws "java.io.IOException: No such file or directory" – Serhii Ostrovskiy Mar 03 '20 at 10:30
  • use `yourFile.getParentFile().mkdirs()` before `yourFile.createNewFile();` if you also create directories. – Bruno Bieri Sep 05 '20 at 16:39
76

Before creating a file, it's needed to create all the parent's directories.

Use yourFile.getParentFile().mkdirs()

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

Pass this f to your FileOutputStream constructor.

Ripon Al Wasim
  • 34,088
  • 37
  • 146
  • 165
Shashank Kadne
  • 7,539
  • 5
  • 38
  • 53
  • 4
    There's a race condition here... Better to do it as follows: File f = new File("Test.txt"); if (!f.createNewFile()) { System.out.println("File already exists"); } – humanity Mar 22 '19 at 13:22
24

You can create an empty file whether it exists or not ...

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

if you want to leave the file if it exists ...

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

You will only get a FileNotFoundException if you try to create the file in a directory which doesn't exist.

Peter Lawrey
  • 498,481
  • 72
  • 700
  • 1,075
22

FileUtils from apache commons is a pretty good way to achieve this in a single line.

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

This will create parent folders if do not exist and create a file if not exists and throw a exception if file object is a directory or cannot be written to. This is equivalent to:

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);

All the above operations will throw an exception if the current user is not permitted to do the operation.

Pratik Nagelia
  • 251
  • 1
  • 4
  • 12
Nikhil Sahu
  • 2,032
  • 2
  • 29
  • 41
4

Create file if not exist. If file exits, clear its content:

/**
 * 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();
    }
}
Do Nhu Vy
  • 33,131
  • 37
  • 143
  • 202
2

Just Giving an alternative way to create the file only if doesn't exists using Path and Files.

Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
    Files.createFile(path);
Files.write(path, ("").getBytes());
Manish Bansal
  • 1,378
  • 1
  • 12
  • 23
0

new FileOutputStream(f) will create a file in most cases, but unfortunately you will get a FileNotFoundException

if the file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened for any other reason

from Javadoc

I other word there might be plenty of cases where you would get FileNotFoundException meaning "Could not create your file", but you would not be able to find the reason of why the file creation failed.

A solution is to remove any call to the File API and use the Files API instead as it provides much better error handling. Typically replace any new FileOutputStream(f) with Files.newOutputStream(p).

In cases where you do need to use the File API (because you use an external interface using File for example), using Files.createFile(p) is a good way to make sure your file is created properly and if not you would know why it didn't work. Some people commented above that this is redundant. It is true, but you get better error handling which might be necessary in some cases.

stackoverflowed
  • 380
  • 2
  • 17
0

You can potentially get a FileNotFoundException if the file does not exist.

Java documentation says:

Whether or not a file is available or may be created depends upon the underlying platform http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

If you're using Java 7 you can use the java.nio package:

The options parameter specifies how the the file is created or opened... it opens the file for writing, creating the file if it doesn't exist...

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

Community
  • 1
  • 1
sikander
  • 2,263
  • 15
  • 22