任意ファイルのダウンロード
任意のファイルをダウンロードは以下のように書くことができます。
val url = "https://path/to/file.zip"; val file = layout.buildDirectory.file("file.zip") URI(url).toURL().openStream().use { Files.copy(it, file.get().asFile.toPath()) }
チャネルを使った場合は以下のようにできます。
Channels.newChannel(URI(url).toURL().openStream()).use { ch -> FileOutputStream(file.get().asFile).getChannel().use { fc -> fc.transferFrom(ch, 0, Long.MAX_VALUE) } }
チャネルを使った方が、効率は良いでしょう。
zip ファイルの解凍
zip ファイルの解凍は、Copy タスクで以下のように実行できます。
tasks.register<Copy>("unzip") { val zip = layout.buildDirectory.file("file.zip") from(zipTree(zip)) into(layout.projectDirectory.dir("out")) }
ダウンロードして解凍
ダウンロードと解凍を合わせると以下のように書けます。
import java.net.URI import java.nio.file.Files // ... tasks.register<Copy>("download") { val url = "https://path/to/file.zip"; val zip = layout.buildDirectory.file("file.zip") val out = layout.buildDirectory.dir("out") zip.get().also { if (!it.asFile.exists()) URI(url).toURL().openStream().use { str -> Files.copy(str, zip.get().asFile.toPath()) } } from(zipTree(zip)) into(out) }
zip ファイルが存在する場合は、ダウンロードはスキップします。