Создать весь путь автоматически при записи в новый файл

246

Я хочу написать новый файл с FileWriter. Я использую это так:

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

Сейчас dir1и в dir2настоящее время не существует. Я хочу, чтобы Java создавала их автоматически, если их там еще нет. На самом деле Java должна установить полный путь к файлу, если он еще не существует.

Как мне этого добиться?


источник

Ответы:

431

Что-то вроде:

File file = new File("C:\\user\\Desktop\\dir1\\dir2\\filename.txt");
file.getParentFile().mkdirs();
FileWriter writer = new FileWriter(file);
Джон Скит
источник
11
Почему getParentFile, а не просто mkdirs?
sauperl
Будет ли он переопределять предыдущую папку, если я переиздаю один и тот же код с другим файлом?
surajs1n
1
@ surajs1n: Если каталог уже существует, mkdirsничего не будет делать.
Джон Скит
3
@sauperl: если файл еще не существует, mkdirs () будет считать, что все указанное является каталогом, и создаст его как таковой (только что проверил). Используя getParentFile () , вы оставляете создание самого файла на FileWriter .
h4nek
149

Начиная с Java 1.7 вы можете использовать Files.createFile:

Path pathToFile = Paths.get("/home/joe/foo/bar/myFile.txt");
Files.createDirectories(pathToFile.getParent());
Files.createFile(pathToFile);
cdmihai
источник
4
Важно помнить, что относительные пути могут вызвать исключение нулевого указателя. Path pathToFile = Paths.get("myFile.txt"); Files.createDirectories(pathToFile.getParent());
Маг
if (! Files.exists (pathToFile.getParent ())) Files.createDirectory (pathToFile.getParent ()); // Проверка, если каталог уже существует, чтобы избежать ошибки
Andre Nel
29

использование 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);
Armand
источник
16

Использование File.mkdirs().

Марсело Кантос
источник
1
Это создаст каталог `C: \\ user \ Desktop \ dir1 \ dir2 \ filename.txt`.
Мартин Шредер,
@ MartinSchröder: Только если вы сохраняете компонент имени файла.
Марсело Кантос
4

Используйте FileUtils для обработки всех этих головных болей.

Редактировать: например, используйте приведенный ниже код для записи в файл, этот метод будет «проверять и создавать родительский каталог, если он не существует».

openOutputStream(File file [, boolean append]) 
kakacii
источник
1
Пожалуйста, не могли бы вы быть более конкретным?
Жан
Привет Жан, Отредактировано. В FileUtils есть целый ряд других полезных методов. Классы ввода-вывода Apache Commons, такие как OIUtils и FileUtils, облегчают жизнь Java-разработчикам.
Какация
1
Я согласен, что FileUtils - это хороший способ, но я думаю, что более простой способ - использовать writeStringToFile, а не openOutputStream. Например, файл file = new File ("C: /user/Desktop/dir1/dir2/filename.txt"); FileUtils.writeStringToFile (файл, "foo bar baz", true);
Пол
Спасибо за это . Сделал мой код намного чище сейчас. Ссылка на недавний javadoc: commons.apache.org/proper/commons-io/javadocs/api-2.5/org/…
Никхил Саху,