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

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

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


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.


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.


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.


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

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

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.