错误的描述的字面意思就是:读取一个File失败,实际上这个路径是一个目录。检测办法如下:
val temp = File(targetPath , fileName)
if (!temp.isFile){
Timber.d(message = "is not file")
}
问题实例分析,(copy)了一段读取zip文件中的文件并复制到指定路径的方法:
private fun decompressFile(targetPath: String, sourceFilePath: String): Boolean {
if (TextUtils.isEmpty(targetPath)) {
return false
}
val targetFile = File(targetPath)
if (!targetFile.exists()) {
targetFile.mkdirs()
}
try {
val file = File(sourceFilePath)
if (!file.exists()) {
return false
}
val zipFile = ZipFile(file)
val zipInputStream = ZipInputStream(FileInputStream(file))
var zipEntry: ZipEntry? = null
while (zipInputStream.nextEntry.also { zipEntry = it } != null) {
val fileName = zipEntry!!.name
if (fileName != null && fileName.contains(FileZipUtil.MAC_IGNORE)) {
continue
}
val temp = File(targetPath, fileName)
if (!temp.exists()) {
temp.createNewFile()
}
if (!temp.isFile) {
Timber.d(message = "is not file")
}
if (zipEntry!!.isDirectory) {
val dir = File(targetPath + File.separator + fileName)
dir.mkdirs()
continue
}
val buffer = ByteArray(1024)
// 通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流
val fileInputStream: InputStream = zipFile.getInputStream(zipEntry)
val os: OutputStream = FileOutputStream(temp)
var len: Int
while (fileInputStream.read(buffer).also { len = it } != -1) {
os.write(buffer, 0, len)
}
os.close()
fileInputStream.close()
}
zipInputStream.close()
return true
} catch (e: java.lang.Exception) {
e.printStackTrace()
return false
}
}
问题代码片段摘取如下:
val targetFile = File(targetPath)
if (!targetFile.exists()) {
targetFile.mkdirs()
}
......
val temp = File(targetPath, fileName)
if (!temp.exists()) {
temp.createNewFile()
}
if (!temp.isFile) {
Timber.d(message = "is not file")
}
......
val os: OutputStream = FileOutputStream(temp)//此处报错
这样写表面看是先生成父目录路径,再执行createNewFile(),其实createNewFile() 返回的结果是false,有兴趣的可以再深度了解下。
修改后的写法:
val temp = File(targetPath, fileName)
temp.parentFile.mkdirs()
if (!temp.exists()) {
temp.createNewFile()
} else {
temp.delete()
temp.createNewFile()
}