I/O - 文件解压
程序员文章站
2022-03-10 22:53:27
在windows上经常做的就是文件的解压,那么有没有想过用io去做这件事呢,现在我们就利用io来解压一个文件。以下代码使用kotlin编写 val zipFile: ZipFile = ZipFile("C:\\Users\\Lenovo\\Downloads\\xxx.zip") val entries = zipFile.entries() while (entries.hasMoreElements()) { val nextElement = entries...
在windows上经常做的就是文件的解压,那么有没有想过用io去做这件事呢,现在我们就利用io来解压一个文件。
以下代码使用kotlin编写
val zipFile: ZipFile = ZipFile("C:\\Users\\Lenovo\\Downloads\\xxx.zip")
val entries = zipFile.entries()
while (entries.hasMoreElements()) {
val nextElement = entries.nextElement()
val name = nextElement.name
println(name)
}
细心的朋友可能会发现,当我的zip文件中中文名称时,程序就会报错当我运行程序时
中文名称的文件并没有打印出来
问题解决
1、最简单办法当然是手动修改文件的名称,但是这样就没有意义了
2、使用基于Ant的Zip压缩工具类 (在这里代码就不贴了)
接下来我们来获取解压的文件
创建不同层级的文件夹
var filePath = "D:\\android\\project\\Aes\\lib3\\src\\main\\java\\file"
val file = File(File(filePath), name)
if (!file.parentFile.exists())
file.parentFile.mkdirs()
执行这段代码我的电脑上将会创建出一个file的文件夹
接下来我们需要定义一个output Steam来写入我们的文件
val fos = FileOutputStream(file)
获取zip中的输出流
val `is` = zipFile.getInputStream(nextElement)
将文件写入file中
var byteArray = ByteArray(1024)
while ( `is`.read(byteArray)!=-1) {
fos.write(byteArray)
}
最后,关闭我们的流,不关闭一定会造成内存泄漏
`is`.close()
fos.close()
zipFile.close()
效果如图
最后贴出完整的代码
fun main() {
val zipFile: ZipFile = ZipFile("C:\\Users\\Lenovo\\Downloads\\xxx.zip")
val entries = zipFile.entries()
while (entries.hasMoreElements()) {
val nextElement = entries.nextElement()
val name = nextElement.name
println(name)
//设置文件解压的目标位置
var filePath = "D:\\android\\project\\Aes\\lib3\\src\\main\\java\\file"
val file = File(File(filePath), name)
if (!file.parentFile.exists())
file.parentFile.mkdirs()
//定义一个输出流
val fos = FileOutputStream(file)
//获取到输入流
val `is` = zipFile.getInputStream(nextElement)
var byteArray = ByteArray(1024)
while ( `is`.read(byteArray)!=-1) {
fos.write(byteArray)
}
//关闭流
`is`.close()
fos.close()
}
//关闭流
zipFile.close()
}
写到这里,后来在运行时发现了问题,zip存在文件夹时是检查不到文件的,所以现在进行修改
fun main() {
//需要解压的文件
val zipFile = ZipFile("C:\\Users\\Lenovo\\Desktop\\test.zip")
//解压的目录
var filePath = "C:\\Users\\Lenovo\\Desktop\\file"
//如果该目录不存在需要先创建
val file = File(filePath)
if (!file.exists())
file.mkdirs()
//获取到zip包中的文件集合
val entries = zipFile.entries()
//遍历取出
while (entries.hasMoreElements()) {
val nextElement = entries.nextElement()
val name = nextElement.name
println(name)
if (!nextElement.isDirectory) {
//设置文件解压的目标位置
val file = File(file, name)
if (!file.parentFile.exists())
file.parentFile.mkdirs()
//定义一个输出流
val fos = FileOutputStream(file)
//获取到输入流
val `is` = zipFile.getInputStream(nextElement)
var byteArray = ByteArray(1024)
while (`is`.read(byteArray) != -1) {
fos.write(byteArray)
}
`is`.close()
fos.close()
}
}
zipFile.close()
}
//只能解压.zip文件格式
//只能解压.zip文件格式
//只能解压.zip文件格式
kotlin确实很好用,建议大家去学习
本文地址:https://blog.csdn.net/qq_36658826/article/details/107182486