一、从assets读取压缩文件保存到缓存文件夹并解压
最近有如上标题需求,简单研究了一下并实现,直接上代码
首先是从assets读取文件流保存到文件夹
fun streamToFile(inputStream: InputStream, target: File): Boolean {
val fileOutputStream = FileOutputStream(target)
return try {
val buffer = ByteArray(4096)
var byteRead: Int
while (inputStream.read(buffer).also { byteRead = it } != -1) {
fileOutputStream.write(buffer, 0, byteRead)
}
true
}catch (e: Throwable) {
e.printStackTrace()
false
}finally {
inputStream.close()
fileOutputStream.flush()
fileOutputStream.close()
}
}
接下来是解压文件的操作
fun unZipFile(source: File, target: File): Boolean {
if (!source.exists() || !source.canRead()) {
return false
}
try {
val zipFile = ZipFile(source)
val zipInputStream = ZipInputStream(FileInputStream(source))
var zipEntry: ZipEntry?
while (zipInputStream.nextEntry.also { zipEntry = it } != null) {
val fileName = zipEntry!!.name
if (fileName != null && fileName.contains(MAC_IGNORE)) {
continue
}
val temp = File(target, fileName)
if (zipEntry!!.isDirectory) {
val dir = File(target, fileName)
dir.mkdirs()
continue
}
if (temp.parentFile != null && (temp.parentFile?.exists() == false)) {
temp.parentFile!!.mkdirs()
}
val buffer = ByteArray(4096)
val os = FileOutputStream(temp)
// 通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流
val inputStream = zipFile.getInputStream(zipEntry)
var len: Int
while (inputStream.read(buffer).also { len = it } != -1) {
os.write(buffer, 0, len)
}
os.close()
inputStream.close()
}
zipInputStream.close()
return true
}catch (e: Throwable) {
e.printStackTrace()
return false
}
}
这样,就可以从assets将压缩文件放到缓存文件夹使用啦
二、问题记录:EditText调用软键盘搜索的setOnKeyListener方法事件执行两次
偶然发现项目中的上的搜索,在点击软键盘上的搜索按钮之后执行了两次
关于这个问题的解决,参考博客https://blog.csdn.net/m0_37700275/article/details/76944153
导致这个问题的出现其实是因为down和up执行,都会执行这个回调,导致搜索事件执行了两次,我采用了第一个方案,在判断条件上增加了对event.getAction() == KeyEvent.ACTION_DOWN的判断,问题得到解决