当前位置: 首页 > 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.dtcms.com/a/275521.html

相关文章:

  • 浅谈 Python 中的 yield——yield的返回值与send()的关系
  • Ether and Wei
  • Spring 框架中的设计模式:从实现到思想的深度解析
  • 贪心算法题解——跳跃游戏【LeetCode】
  • AI大模型(七)Langchain核心模块与实战(二)
  • Android音视频探索之旅 | C++层使用OpenGL ES实现视频渲染
  • CTFHub————Web{信息泄露[Git泄露(log)]}
  • 《Java Web程序设计》实验报告五 Java Script学习汇报
  • Redis Geospatial 功能详解及多边形包含判断实现
  • win10安装Rust Webassembly工具链(wasm-pack)报错。
  • Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库
  • Rust Web 全栈开发(六):在 Web 项目中使用 MySQL 数据库
  • 前端note
  • 【推荐】前端低端机和弱网环境下性能优化
  • 前端面试专栏-算法篇:24. 算法时间与空间复杂度分析
  • 在前端开发中关于reflow(回流)和repaint(重绘)的几点思考
  • MySQL 中图标字符存储问题探究:使用外挂法,毕业论文——仙盟创梦IDE
  • AI驱动的大前端内容创作与个性化推送:资讯类应用实战指南
  • 容器化改造避坑指南:传统应用迁移K8s的10个关键节点(2025实战复盘)
  • CSS flex
  • Capsule Networks:深度学习中的空间关系建模革命
  • GGE Lua 详细教程
  • 《Java Web程序设计》实验报告四 Java Script前端应用和表单验证
  • 基于Java的Markdown到Word文档转换工具的实现
  • 基于大模型的鼻咽癌全周期预测及诊疗优化研究报告
  • EPLAN 电气制图(七):电缆设计全攻略
  • 系统学习Python——并发模型和异步编程:基础实例-[使用进程实现旋转指针]
  • 代码训练LeetCode(45)旋转图像
  • 【算法笔记】7.LeetCode-Hot100-图论专项
  • 【node/vue】css制作可3D旋转倾斜的图片,朝向鼠标