当前位置: 首页 > news >正文

Kotlin文件操作

文件操作

获取目录内容及获取文件/目录的父级路径

使用 File

val helloWorld = File("/Files/CompletedProjects/HelloWorld")
val helloWorldFilesNames = helloWorld.listFiles().map { it.name } // [Doc.pdf, Reviews.txt]val reviews = File("/Files/CompletedProjects/HelloWorld/Reviews.txt")
val reviewsFiles = reviews.listFiles() // nullval soundtracks = File("/Files/Music/SoundTracks")
val soundtracksFiles = soundtracks.listFiles() // []

使用 Path

val helloWorld = Path("/Files/CompletedProjects/HelloWorld")
val helloWorldFilesNames = helloWorld.listDirectoryEntries().map { it.name } // [Doc.pdf, Reviews.txt]val reviews = Path("/Files/CompletedProjects/HelloWorld/Reviews.txt")
val reviewsFiles = if (reviews.isDirectory()) reviews.listDirectoryEntries() else emptyList() // []val soundtracks = Path("/Files/Music/SoundTracks")
val soundtracksFiles = if (soundtracks.isDirectory()) soundtracks.listDirectoryEntries() else emptyList() // []

解释:

  • reviewsFilesnull,因为 Reviews.txt 是一个普通文件,不是目录,因此不能包含子文件或子目录。

  • soundtracksFiles 是空数组([]),因为虽然它是目录,但里面没有文件或子目录。


获取父目录

  • File.parentPath.parent 返回父目录的路径字符串。

  • File.parentFilePath.parent.fileName 返回父目录的 FilePath 对象,方便进一步操作。

val files = File("/Files")
println(files.parent) // 输出: "/"
println(files.parentFile.name) // 输出: ""val reviews = File("/Files/CompletedProjects/HelloWorld/Reviews.txt")
println(reviews.parent) // 输出: "/Files/CompletedProjects/HelloWorld"
println(reviews.parentFile.name) // 输出: "HelloWorld"val root = File("/")
println(root.parent) // 输出: null
println(root.parentFile.name) // 抛出 java.lang.NullPointerException

双向遍历目录结构

使用 File.walk()Path.walk()

val files = File("/Files")println("TOP_DOWN:")
files.walk(FileWalkDirection.TOP_DOWN).forEach { println(it) }println("BOTTOM_UP:")
files.walk(FileWalkDirection.BOTTOM_UP).forEach { println(it) }
val dir = Path("/Files")println("TOP_DOWN:")
dir.walk().forEach { println(it) }println("BOTTOM_UP:")
dir.walk().asIterable().reversed().forEach { println(it) }

输出示例:

TOP_DOWN:
/Files
/Files/Music
/Files/Music/SoundTracks
/Files/CompletedProjects
/Files/CompletedProjects/HelloWorld
/Files/CompletedProjects/HelloWorld/Doc.pdf
/Files/CompletedProjects/HelloWorld/Reviews.txt
/Files/CompletedProjects/JCalculator
/Files/CompletedProjects/JCalculator/Doc.pdfBOTTOM_UP:
/Files/Music/SoundTracks
/Files/Music
/Files/CompletedProjects/HelloWorld/Doc.pdf
/Files/CompletedProjects/HelloWorld/Reviews.txt
/Files/CompletedProjects/HelloWorld
/Files/CompletedProjects/JCalculator/Doc.pdf
/Files/CompletedProjects/JCalculator
/Files/CompletedProjects
/Files

等效方法还有:

  • File.walkBottomUp():自底向上遍历

  • File.walkTopDown():自顶向下遍历


操作目录结构

假设我们有如下目录结构,并要获取 CompletedProjects 下的项目:

val completedProjects = File("/Files/CompletedProjects")
val projects = completedProjects.walk()
projects.maxDepth(1) // 只遍历 HelloWorld 和 JCalculator

或者用 Path

val completedProjects = Path("/Files/CompletedProjects")
val projects = Files.walk(completedProjects, 1)

然后可以使用如下方式获取 HelloWorld 项目:

val helloWorldProject = projects.first { it.name == "HelloWorld" }

或者更简洁地:

val helloWorldProject = completedProjects.listFiles().first { it.name == "HelloWorld" }

从文件逐级向上寻找目录

Reviews.txt 开始,逐级寻找其祖先目录中名为 Files 的目录:

val reviews = File("/Files/CompletedProjects/HelloWorld/Reviews.txt")
var parent = reviews.parentFile
while (parent.name != "Files") {parent = parent.parentFile
}val soundTracks = parent.walkTopDown().first { it.name == "SoundTracks" }

复制文件

复制单个文件

val fileIn = File("newFile.txt")
val fileOut = File("copyNewFile")
fileIn.copyTo(fileOut) // 不覆盖// 若要覆盖:
fileIn.copyTo(fileOut, overwrite = true)
val fileIn = Path("newFile.txt")
val fileOut = Path("copyNewFile.txt")
fileIn.copyTo(fileOut)
fileIn.copyTo(fileOut, overwrite = true)

复制整个目录(递归)

使用 File.copyRecursively()

val fileIn = File("outDir")
val fileOut = File("newDir")
fileIn.copyRecursively(fileOut)
fileIn.copyRecursively(fileOut, overwrite = true)

使用 Path.copyToRecursively()

val pathIn = Path("outDir")
val pathOut = Path("newDir")
pathIn.copyToRecursively(pathOut)
pathIn.copyToRecursively(pathOut, overwrite = true, followLinks = true)

总结

  • Kotlin 提供了丰富的 API 来操作文件和目录,包括遍历、复制、获取父路径等。

  • 可以使用 FilePath 来创建、读取、遍历文件系统。

  • 遍历时注意根目录的处理,避免空指针异常。

  • 实际编程中应加上异常处理与空值检查。

http://www.lryc.cn/news/586043.html

相关文章:

  • 留学真相:凌晨两点被海关拦下时,我才明白人生没有退路
  • 【Java八股文总结 — 包学会】(二)计算机网络
  • 力扣 hot100 Day42
  • 精密模具大深径比微孔尺寸检测方案 —— 激光频率梳 3D 轮廓检测
  • 【STM32实践篇】:最小系统组成
  • AI软件出海SEO教程
  • Ubuntu快速搭建QT开发环境指南,5000字解析!!
  • 鸿蒙的NDK开发初级入门篇
  • 附件1.2025年世界职业院校技能大赛赛道简介
  • 分音塔科技(BABEL Technology) 的公司背景、股权构成、产品类型及技术能力的全方位解读
  • 2025 年 4-6 月大模型备案情况分析
  • Ansible 高版本 SELinux 模块深度解析:内置接口原理与实战指南
  • 迷宫可达性统计问题详解
  • 啤酒自动装箱机构设计cad【10张】+三维图+设计说明书
  • Linux操作系统之进程间通信:共享内存
  • Javaweb- 11 MVC架构模式
  • Redis渗透思路总结
  • Python 三大高频标准库实战指南——json · datetime · random 深度解析
  • FastGPT革命:下一代语言模型的极速进化
  • 淘宝商品评论API接口操作详解
  • MCP选型指南:AWS vs Azure vs GCP vs 国内云厂商深度对比
  • 基于 Python 的数据分析技术综述
  • 自动化运维工具jenkins问题
  • 集成语音感知与云平台的多任务智能楼宇控制系统
  • 详解缓存淘汰策略:LRU
  • Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
  • Markdown语法的基础学习
  • 管理端口: 一个简单的锤子架子
  • Linux->基础IO
  • 【深度学习】 1 Deep Learning