Crie um caminho inteiro automaticamente ao gravar em um novo arquivo


246

Eu quero escrever um novo arquivo com o FileWriter. Eu uso assim:

FileWriter newJsp = new FileWriter("C:\\user\Desktop\dir1\dir2\filename.txt");

Agora dir1e dir2atualmente não existem. Eu quero que o Java os crie automaticamente se eles ainda não estiverem lá. Na verdade, o Java deve configurar o caminho completo do arquivo, se ainda não existir.

Como posso conseguir isso?

Respostas:


431

Algo como:

File file = new File("C:\\user\\Desktop\\dir1\\dir2\\filename.txt");
file.getParentFile().mkdirs();
FileWriter writer = new FileWriter(file);

11
Por que getParentFile e não apenas mkdirs?
sauperl

Ele substituirá a pasta anterior, se eu estiver reemitindo o mesmo código com um arquivo irmão diferente?
surajs1n

1
@ surajs1n: Se o diretório já existir, mkdirsnão fará nada.
Jon Skeet

3
@ sauperl: Se o arquivo ainda não existir, o mkdirs () assumirá que tudo o que está especificado é um diretório e o cria como tal (apenas o testou). Usando getParentFile () , você deixa a criação do próprio arquivo para o FileWriter .
H4nek

149

Desde o Java 1.7, você pode usar o Files.createFile:

Path pathToFile = Paths.get("/home/joe/foo/bar/myFile.txt");
Files.createDirectories(pathToFile.getParent());
Files.createFile(pathToFile);

4
É importante ter em mente que caminhos relativos podem causar exceção de ponteiro nulo. Path pathToFile = Paths.get("myFile.txt"); Files.createDirectories(pathToFile.getParent());
Mag

if (! Files.exists (pathToFile.getParent ())) Files.createDirectory (pathToFile.getParent ()); // Teste se o dir já existe a erro evitar
Andre Nel

29

Use File.mkdirs():

File dir = new File("C:\\user\\Desktop\\dir1\\dir2");
dir.mkdirs();
File file = new File(dir, "filename.txt");
FileWriter newJsp = new FileWriter(file);


4

Use o FileUtils para lidar com todas essas dores de cabeça.

Edit: Por exemplo, use o código abaixo para gravar em um arquivo, esse método 'verificará e criará o diretório pai, se ele não existir'.

openOutputStream(File file [, boolean append]) 

1
Por favor, você poderia ser mais específico?
Jean

Oi Jean, Editado. Há vários outros métodos úteis no FileUtils. As classes IO do Apache Commons, como OIUtils e FileUtils, facilitam a vida dos desenvolvedores de java.
kakacii

1
Concordo que o FileUtils é um bom caminho a percorrer, mas acho que uma maneira mais fácil de fazer isso é usando writeStringToFile, não openOutputStream. Por exemplo, arquivo file = new File ("C: /user/Desktop/dir1/dir2/filename.txt"); FileUtils.writeStringToFile (arquivo, "foo bar baz", true);
paul

Obrigado por isso. Tornei meu código muito mais limpo agora. Link para javadoc recente: commons.apache.org/proper/commons-io/javadocs/api-2.5/org/…
Nikhil Sahu
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.