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);
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);
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);
createNewFile()
method, as shown in my example. –
Chickenhearted createNewFile()
itself atomically checks the existence of the file. –
Jerilynjeritah createNewFile()
is a total waste of time here. The system will already do that. You're just forcing it to look twice. –
Derward yourFile.getParentFile().mkdirs()
before yourFile.createNewFile();
if you also create directories. –
Brandt createNewFile()
, which is redundant and wasteful here. –
Derward Before creating a file, it's necessary to create all parent directories.
Use yourFile.getParentFile().mkdirs()
Update: Create all parent folders only when they are not already exist. Otherwise it is not necessary.
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.
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.
new FileOutputStream(...)
already does that, and now you are forcing it to delete the file created here as well. –
Derward 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.
EDIT: From Java 7 you can create a file, but get more meaningful error messages when it fails.
Path newFilePath = Paths.get(FILE_NAME);
Files.createFile(newFilePath); // throws FileAlreadyExistsException if it exists
This post has many variations. https://www.baeldung.com/java-how-to-create-a-file
FileNotFoundException
in both cases. –
Eric 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();
}
}
new FileOutputStream(...)
already does that, and now you are forcing it to delete the file created here as well. –
Derward 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());
new FileOutputStream(...)
already does that, and now you are forcing it to delete the file created here as well. –
Derward 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
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
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.
Files.newOutputStream()
does not have better error handling than new FileOutputStream
. if you think otherwise please substantiate your assertion. –
Derward © 2022 - 2024 — McMap. All rights reserved.
Files.write(Paths.get("./score.txt"), "sometext".getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.APPEND);
. StandardOpenOptions – Disembowel