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

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.xdnf.cn/news/15217.html

相关文章:

  • 2025 年 4-6 月大模型备案情况分析
  • 单链表的题目,咕咕咕
  • 【Scratch】从入门到放弃(四):指令大全-九大类之事件、控制、侦测
  • 【小情绪小感悟】
  • houdini 用 vellum 制作一个最简单的布料
  • SiC 型储能充电器设计与研究
  • 岛屿数量问题
  • HT8313功放入门
  • Cell2location maps fine-grained cell types in spatial transcriptomics 文章解析
  • Golang操作MySQL json字段优雅写法
  • 【数据结构初阶】--顺序表(三)
  • 【机器学习实战笔记 16】集成学习:LightGBM算法
  • 【读书笔记】从AI到Transformer:LLM技术演进全解析
  • 智能Agent场景实战指南 Day 11:财务分析Agent系统开发
  • 动态规划基本操作
  • Vue3 学习教程,从入门到精通,Vue3指令知识点及使用方法详细介绍(6)
  • 【TOOL】ubuntu升级cmake版本
  • Linux驱动08 --- 数据库
  • 【PTA数据结构 | C语言版】后缀表达式求值
  • Mamba架构的模型 (内容由deepseek辅助汇总)
  • Edge浏览器:报告不安全的站点的解决方案
  • JAVA线程池详解+学习笔记
  • 鸿蒙NDK开发技巧之-----HAP包如何引入HSP包后,如何给HSP的包传递上下文
  • 非欧几里得空间图卷积算子设计:突破几何限制的图神经网络新范式
  • 从LLM到VLM:视觉语言模型的核心技术与Python实现
  • 如何搭建一个高质量的开放接口平台
  • 顺序队列和链式队列
  • HTML(上)
  • 混合精度训练:梯度缩放动态调整的艺术与科学
  • day4--上传图片、视频