Java FileOutputStream Criar arquivo, se não existir

187

Existe uma maneira de usar o FileOutputStream de uma maneira que, se um arquivo (String filename) não existir, ele será criado?

FileOutputStream oFile = new FileOutputStream("score.txt", false);
Stefan Dunn
fonte

Respostas:

302

Ele lançará a FileNotFoundExceptionse o arquivo não existir e não puder ser criado ( doc ), mas será criado se possível. Para ter certeza, você provavelmente deve primeiro testar se o arquivo existe antes de criar o FileOutputStream(e criar com, createNewFile()se não existir):

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 
talnicolas
fonte
2
se o arquivo não existir, como eu criaria um arquivo .txt vazio?
23413 Stefan Dunn #
3
@StefanDunn com o createNewFile()método, como mostrado no meu exemplo.
talnicolas
55
A condição é redundante. De acordo com o JavaDoc , createNewFile()ele próprio verifica atomicamente a existência do arquivo.
Aztek
8
@aztek provavelmente poderíamos deixar a condição para melhorar a legibilidade do código
Andrii Chernenko
2
createNewFile()é uma total perda de tempo aqui. O sistema já fará isso. Você está apenas forçando a aparência duas vezes.
Marquês de Lorne
61

Antes de criar um arquivo, é necessário criar todos os diretórios dos pais.

Usar yourFile.getParentFile().mkdirs()

Kostiantyn Medvid
fonte
23

Você pode criar um arquivo vazio, exista ou não ...

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

se você quiser deixar o arquivo se ele existir ...

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

Você só receberá uma FileNotFoundException se tentar criar o arquivo em um diretório que não existe.

Peter Lawrey
fonte
3
Joga FileNotFoundExceptionem ambos os casos.
mixel
21
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

Passe isso fpara o seu FileOutputStreamconstrutor.

Shashank Kadne
fonte
2
Há uma condição de corrida aqui ... É melhor fazer o seguinte: File f = new File ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("O arquivo já existe"); }
humanidade
19

O FileUtils do apache commons é uma boa maneira de conseguir isso em uma única linha.

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

Isso criará pastas pai se não existirem e criará um arquivo se não existir e lançará uma exceção se o objeto de arquivo for um diretório ou não puder ser gravado. Isso é 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 as operações acima lançarão uma exceção se o usuário atual não tiver permissão para fazer a operação.

Nikhil Sahu
fonte
4

Crie um arquivo se não existir. Se o arquivo sair, limpe seu conteúdo:

/**
 * 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
fonte
2

Apenas fornecendo uma maneira alternativa de criar o arquivo apenas se ele não existir usando o 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
fonte
0

Você pode obter um potencial FileNotFoundExceptionse o arquivo não existir.

A documentação Java diz:

A disponibilidade ou não de um arquivo disponível depende da plataforma subjacente http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

Se você estiver usando o Java 7, poderá usar o pacote java.nio:

O parâmetro options especifica como o arquivo é criado ou aberto ... abre o arquivo para gravação, criando o arquivo se ele não existir ...

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

sikander
fonte
0

new FileOutputStream(f) criará um arquivo na maioria dos casos, mas infelizmente você receberá uma FileNotFoundException

se o arquivo existir, mas for um diretório, e não um arquivo normal, não existir, mas não puder ser criado ou não puder ser aberto por qualquer outro motivo

de Javadoc

Em outras palavras, pode haver muitos casos em que você obterá FileNotFoundException, que significa "Não foi possível criar seu arquivo", mas você não conseguirá encontrar o motivo pelo qual a criação do arquivo falhou.

Uma solução é remover qualquer chamada para a API de arquivos e, em vez disso, usar a API de arquivos, pois fornece um tratamento de erros muito melhor. Substitua normalmente qualquer um new FileOutputStream(f)por Files.newOutputStream(p).

Nos casos em que você precisa usar a API de arquivos (porque usa uma interface externa usando o arquivo, por exemplo), usar Files.createFile(p)é uma boa maneira de garantir que seu arquivo seja criado corretamente e, caso contrário, você saberia por que não funcionou. Algumas pessoas comentaram acima que isso é redundante. É verdade, mas você obtém melhor tratamento de erros, o que pode ser necessário em alguns casos.

stackoverflowed
fonte