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);
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);
Respostas:
Ele lançará a FileNotFoundException
se 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);
createNewFile()
método, como mostrado no meu exemplo.
createNewFile()
é uma total perda de tempo aqui. O sistema já fará isso. Você está apenas forçando a aparência duas vezes.
Antes de criar um arquivo, é necessário criar todos os diretórios dos pais.
Usar yourFile.getParentFile().mkdirs()
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.
FileNotFoundException
em ambos os casos.
File f = new File("Test.txt");
if(!f.exists()){
f.createNewFile();
}else{
System.out.println("File already exists");
}
Passe isso f
para o seu FileOutputStream
construtor.
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.
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();
}
}
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());
Você pode obter um potencial FileNotFoundException
se 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
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
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.