前言
最近使用gradle编译安卓的时候又出现了gradle下载超时的问题,经常性地手动下载再复制到目录,确实每次都做,每次都很繁琐。
一、软件简介
自动下载指定gradle版本到本地gradle的目标目录
二、下载地址
见评论区
三、截图
四、代码片段分享
小工具是使用jetpack compose for desktop编写的,实际上也没有什么技术含量,简单地分享几个代码片段。
- 点击按钮时启动下载线程
Button({
for (fName in gradleFileNames.split("\n")) {
val fileName = fName.trim().removeSuffix(".zip")
if (fileName.isNotEmpty()) {
gradleFileDirName = getFolderName("https://services.gradle.org/distributions/${fileName}.zip")
val src = "${gradleSrcUrl}/${fileName}.zip"
val tarFilePath = "${gradleDir}\\wrapper\\dists\\${fileName}\\${gradleFileDirName}\\$fileName.zip"
thread {
Downloader.download(src, tarFilePath) { status ->
println("callback status $status")
appendTaskStatus(status)
}
}
}
}
}) {
Text("下载")
}
- 读取服务器文件的内容
fun fileContent(fileUrl: String): String?{
try {
val conn = URI(fileUrl).toURL().openConnection()
if(conn.contentType.startsWith("text/plain;")) { //text/plain; charset=utf-8
val contentStream = conn.content as InputStream
val content = contentStream.readAllBytes().decodeToString()
return content
}
}catch (e: Exception){
println("exception $e")
}
return null
}
- 下载网络二进制文件
fun download(fileURL: String, savePath: String, callback: (DownloadStatus)->Unit){
callback(DownloadStatus("新的任务 from $fileURL, to $savePath", fileURL, savePath))
try {
val conn = URI(fileURL).toURL().openConnection()
val inputStream = conn.getInputStream()
val tarDir = File(File(savePath).parent)
if(!tarDir.exists()){
if(!tarDir.mkdirs()){
callback(DownloadStatus("创建目标文件夹失败 $tarDir", fileURL, savePath))
return
}
}
callback(DownloadStatus("开始下载 $fileURL", fileURL, savePath))
val tmpPath = "$savePath.tmp"
val tarFile = File(tmpPath)
tarFile.createNewFile()
val buff = inputStream.readAllBytes()
val fos = FileOutputStream(tarFile)
fos.write(buff)
fos.close()
inputStream.close()
callback(DownloadStatus("下载完成 $savePath", fileURL, savePath))
File(tmpPath).renameTo(File(savePath))
} catch (e: Exception) {
println("catch a exception $e")
callback(DownloadStatus("下载失败: $e", fileURL, savePath))
}
println("download finish $fileURL, to $savePath")
}
- 其中DownloadStatus的定义(用于整合下载状态)
class DownloadStatus(
val message: String,
val fromUrl: String="",
val toPath: String="",
val error: String="",
val date: String= Date().toString(),
val attachedList: MutableList<DownloadStatus> = mutableListOf()
)