¿Hay alguna manera de usar FileOutputStream de una manera que si un archivo (String filename) no existe, entonces lo creará?
FileOutputStream oFile = new FileOutputStream("score.txt", false);
¿Hay alguna manera de usar FileOutputStream de una manera que si un archivo (String filename) no existe, entonces lo creará?
FileOutputStream oFile = new FileOutputStream("score.txt", false);
Respuestas:
Lanzará un FileNotFoundException
si el archivo no existe y no se puede crear ( doc ), pero lo creará si puede. Para asegurarse de que probablemente debería probar primero que el archivo existe antes de crear el FileOutputStream
(y crear con createNewFile()
si no es así):
File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing
FileOutputStream oFile = new FileOutputStream(yourFile, false);
createNewFile()
método, como se muestra en mi ejemplo.
createNewFile()
Es una pérdida total de tiempo aquí. El sistema ya lo hará. Solo lo estás obligando a mirar dos veces.
Antes de crear un archivo, es necesario crear todos los directorios de los padres.
Utilizar yourFile.getParentFile().mkdirs()
Puede crear un archivo vacío si existe o no ...
new FileOutputStream("score.txt", false).close();
si quieres dejar el archivo si existe ...
new FileOutputStream("score.txt", true).close();
Solo obtendrá una FileNotFoundException si intenta crear el archivo en un directorio que no existe.
FileNotFoundException
en ambos casos.
File f = new File("Test.txt");
if(!f.exists()){
f.createNewFile();
}else{
System.out.println("File already exists");
}
Pase esto f
a su FileOutputStream
constructor.
FileUtils de apache commons es una muy buena manera de lograr esto en una sola línea.
FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))
Esto creará carpetas principales si no existen y creará un archivo si no existe y generará una excepción si el objeto del archivo es un directorio o no se puede escribir en él. Esto es equivalente a :
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);
Todas las operaciones anteriores arrojarán una excepción si el usuario actual no tiene permiso para realizar la operación.
Crear archivo si no existe. Si el archivo sale, borre su contenido:
/**
* 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();
}
}
Simplemente dando una forma alternativa de crear el archivo solo si no existe usando 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());
Potencialmente puede obtener un FileNotFoundException
si el archivo no existe.
La documentación de Java dice:
El hecho de si un archivo está disponible o no o puede crearse depende de la plataforma subyacente http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html
Si está utilizando Java 7, puede usar el paquete java.nio:
El parámetro de opciones especifica cómo se crea o abre el archivo ... abre el archivo para escribir, creando el archivo si no existe ...
http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html
new FileOutputStream(f)
creará un archivo en la mayoría de los casos, pero desafortunadamente obtendrá una excepción FileNotFoundException
si el archivo existe pero es un directorio en lugar de un archivo normal, no existe pero no se puede crear o no se puede abrir por ningún otro motivo
En otras palabras, podría haber muchos casos en los que obtendría FileNotFoundException que significa "No se pudo crear su archivo", pero no podría encontrar la razón por la cual falló la creación del archivo.
Una solución es eliminar cualquier llamada a la API de archivos y utilizar la API de archivos, ya que proporciona un manejo de errores mucho mejor. Por lo general, reemplace cualquiera new FileOutputStream(f)
con Files.newOutputStream(p)
.
En los casos en los que necesite usar la API de archivo (porque usa una interfaz externa que usa File, por ejemplo), usar Files.createFile(p)
es una buena manera de asegurarse de que su archivo se cree correctamente y, de lo contrario, sabría por qué no funcionó. Algunas personas comentaron anteriormente que esto es redundante. Es cierto, pero obtienes un mejor manejo de errores que puede ser necesario en algunos casos.