Java FileOutputStream Crear archivo si no existe

187

¿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);
Stefan Dunn
fuente

Respuestas:

302

Lanzará un FileNotFoundExceptionsi 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); 
talnicolas
fuente
2
si el archivo no existe, ¿cómo crearía un archivo .txt vacío?
Stefan Dunn
3
@StefanDunn con el createNewFile()método, como se muestra en mi ejemplo.
talnicolas
55
La condición es redundante. Según JavaDoc , createNewFile()sí mismo comprueba atómicamente la existencia del archivo.
aztek
8
@aztek probablemente podríamos dejar la condición para mejorar la legibilidad del código
Andrii Chernenko
2
createNewFile()Es una pérdida total de tiempo aquí. El sistema ya lo hará. Solo lo estás obligando a mirar dos veces.
Marqués de Lorne
61

Antes de crear un archivo, es necesario crear todos los directorios de los padres.

Utilizar yourFile.getParentFile().mkdirs()

Kostiantyn Medvid
fuente
23

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.

Peter Lawrey
fuente
3
Se lanza FileNotFoundExceptionen ambos casos.
mixel
21
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

Pase esto fa su FileOutputStreamconstructor.

Shashank Kadne
fuente
2
Hay una condición de carrera aquí ... Mejor hacerlo de la siguiente manera: Archivo f = archivo nuevo ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("El archivo ya existe"); }
humanidad
19

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.

Nikhil Sahu
fuente
4

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();
    }
}
Do Nhu Vy
fuente
2

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());
Bansal Manish
fuente
0

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

sikander
fuente
0

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

de Javadoc

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.

stackoverflowed
fuente