kotlin编写的,java的话大体相同
object FileUtils {
/**
* 创建并写入文件
* 如果是临时文件请在finally调用删除方法
*
* @param url url 文件名/地址
* @param json json内容
* @throws IOException 由调用方法处理
*/
@JvmStatic
@Throws(IOException::class)
fun createAndWriteFile(url: String, json: String) {
val path = Paths.get(url)
// 如果已存在,删除旧文件
deleteFile(path)
// 创建文件
Files.createFile(path)
Files.newBufferedWriter(path).use { bfw ->
bfw.write(json)
bfw.flush()
}
}
/**
* 强制删除文件/文件夹(含不为空的文件夹)
*
* @param url url 文件夹地址.
* @throws IOException 由调用方法处理
*/
@JvmStatic
@Throws(IOException::class)
fun deleteFile(url: String) {
val path = Paths.get(url)
deleteFile(path)
}
/**
* 强制删除文件/文件夹(含不为空的文件夹)
*/
@JvmStatic
@Throws(IOException::class)
fun deleteFile(path: Path) {
try {
Files.deleteIfExists(path)
} catch (e: DirectoryNotEmptyException) {
Files.walkFileTree(path, object : SimpleFileVisitor<Path>() {
/**
* 正在访问一个文件时删除文件
*/
override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult {
Files.delete(file)
return FileVisitResult.CONTINUE
}
/**
* 访问一个目录后删除目录
*/
override fun postVisitDirectory(dir: Path, exc: IOException?): FileVisitResult {
if (exc == null) {
Files.delete(dir)
return super.postVisitDirectory(dir, exc)
} else {
throw exc
}
}
})
}
}
/**
* 只创建文件夹
*/
@JvmStatic
fun createDirectory(dirUrl: String) {
val path = Paths.get(dirUrl)
// 如果已存在,删除旧文件
deleteFile(dirUrl)
// 创建文件夹
Files.createDirectory(path)
}
/**
* 下载图片并保存到指定目录
*
* @param url String url
* @param saveDir String 目录
* @param fileName String 文件名 为空则使用原文件名
*/
@JvmStatic
fun downloadAndSaveFile(url: String, saveDir: String, fileName: String? = null) {
val saveFileName = fileName ?: url.substring(url.lastIndexOf("/") + 1)
URL(url).openStream().use { ins ->
val target = Paths.get(saveDir, saveFileName)
Files.createDirectories(target.parent)
Files.copy(ins, target, StandardCopyOption.REPLACE_EXISTING)
}
}
/**
* 压缩
*
*/
@JvmStatic
@Throws(IOException::class)
fun zip(targetFile: String, srcDir: String) {
FileOutputStream(targetFile).use { outputStream -> zip(srcDir, outputStream) }
}
/**
* 压缩文件夹到指定输出流中,可以是本地文件输出流,也可以是web响应下载流
*/
@JvmStatic
@Throws(IOException::class)
fun zip(srcDir: String, outputStream: OutputStream) {
BufferedOutputStream(outputStream).use { bufferedOutputStream ->
ZipArchiveOutputStream(bufferedOutputStream).use { out ->
val start = Paths.get(srcDir)
Files.walkFileTree(start, object : SimpleFileVisitor<Path>() {
// override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult {
// val entry = ZipArchiveEntry(dir.toFile(), start.relativize(dir).toString())
// out.putArchiveEntry(entry)
// out.closeArchiveEntry()
// return super.preVisitDirectory(dir, attrs)
// }
override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult {
FileInputStream(file.toFile()).use { input ->
val entry = ZipArchiveEntry(file.toFile(), start.relativize(file).toString())
out.putArchiveEntry(entry)
IOUtils.copy(input, out)
out.closeArchiveEntry()
}
return super.visitFile(file, attrs)
}
})
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)