Kotlin - 文件类 File

2023-11-18

文件操作

遍历 walk() 自上而下,深度优先,遍历整个文件夹。
walkBottomUp() 自下而上的顺序遍历文件目录和内容。
walkTopDown() 自上而下的顺序遍历文件目录和内容。
名称 extension() 文件名的后缀格式,不包含“.”,例如 mp3。
nameWithoutExtension() 文件名,不包含后缀。

Kotlin把目录遍历这个功能重新梳理了一下,归纳为FileTreeWalk文件树。首先调用File对象的walk方法得到FileTreeWalk实例,接着依次为该实例设置具体的条件,包括遍历深度、是否匹配文件夹、文件扩展名,以及最后的文件队列循环处理。

//遍历文件
file.parentFile //获取上级目录
    .walk() //先访问文件夹,再访问里面的内容
    .maxDepth(1)//需遍历的目录层级为1,即无需检查子目录
    .filter { it.isFile } //只挑选文件,不处理文件夹
    .filter { it.extension in listOf("png","jpg") } //选择扩展名为png和jpg的图片文件
//        .filter { it.extension.equals("txt", true) }
    .forEach(::println)//循环处理符合条件的文件

//文件拷贝
file.copyTo(File(file.parent, "copy.txt"), true)
//文件夹拷贝
//target:新地址
//overwrite:是否覆盖
//onError:失败的回调
file.parentFile.copyRecursively(
    File(file.parentFile.parentFile.parent, "copyRecursively"),
    true
)

流操作

readBytes()

public fun File.readBytes(): ByteArray

以 ByteArray 形式返回读取到的全部文件内容,上限2G。

readText()

File.readText(charset: Charset = Charsets.UTF_8): String

以 String 形式返回读取到的全部文件内容,上限2G,默认编码UTF-8。

readLines()

public fun File.readLines(charset: Charset = Charsets.UTF_8): List<String>

以 List<String> 形式返回读取到的文件全部内容,一行内容是一个元素,只能是文本。不要在大文件上使用此方法。

useLines()

public inline fun <T> File.useLines(charset: Charset = Charsets.UTF_8, block: (Sequence<String>) -> T): T

拿到所有行的序列,并调用action。

forEachLine()

public fun File.forEachLine(charset: Charset = Charsets.UTF_8, action: (line: String) -> Unit): Unit

按行读取文件并为每行调用action,适用于大文件。

forEachBlock()

public fun File.forEachBlock(action: (buffer: ByteArray, bytesRead: Int) -> Unit): Unit 
public fun File.forEachBlock(blockSize: Int, action: (buffer: ByteArray, bytesRead: Int) -> Unit): Unit

按字节块读取文件并为每个读取的块调用action,字节块默认为4096最小为512。适用于大文件。

writeBytes()

public fun File.appendBytes(array: ByteArray): Unit

写入字节数组,已有同名文件会覆盖。

writeText()

public fun File.writeText(text: String, charset: Charset = Charsets.UTF_8): Unit

写入字符串,已有同名文件会覆盖。

appendBytes()

public fun File.writeBytes(array: ByteArray): Unit

追加字节数组到文件末尾。

appendText()

public fun File.appendText(text: String, charset: Charset = Charsets.UTF_8): Unit

追加字符串到文件末尾。

拷贝 copyTo() 复制文件或者文件夹,并且会创建target所需的各个父级文件夹(如果缺少)。overwrite为true时,target可被覆盖,不为true并且当target存在时,返回false,复制失败。overwrite为true并且target是一个文件夹时,只有当文件夹为空时才会被替换。源文件如果是文件夹,则只会创建目标文件夹,不会复制文件夹中的文件。该操作不会保留复制的文件属性,例如创建/修改日期、权限等。
copyRecursively() 递归复制文件或者文件夹,并且会创建target所需的各个父级文件夹(如果缺少)。如果源文件是文件夹,将复制文件夹中的所有内容。该操作不会保留复制的文件属性,例如创建/修改日期、权限等。默认自带的错误处理器会将错误抛出,可以传入一个Lambda用来处理异常。复制文件夹失败时,可能已经复制了一部分。
删除 deleteRecursively() 递归删除文件或者文件夹,删除文件夹失败时,可能已经删除了一部分。
Java流对象

inputStream()

outputStream()

public inline fun File.inputStream(): FileInputStream
public inline fun File.outputStream(): FileOutputStream

reader()

writer()

public inline fun File.reader(charset: Charset = Charsets.UTF_8): InputStreamReader

返回一个InputStreamReader以读取此文件的内容。

public inline fun File.writer(charset: Charset = Charsets.UTF_8): OutputStreamWriter

返回一个OutputStreamWriter用于写入此文件。

bufferedReader()

bufferedWriter()

public inline fun File.bufferedReader(charset: Charset = Charsets.UTF_8, bufferSize: Int = DEFAULT_BUFFER_SIZE): BufferedReader

返回一个BufferedReader用于读取此文件的内容,默认大小8*1024。

public inline fun File.bufferedWriter(charset: Charset = Charsets.UTF_8, bufferSize: Int = DEFAULT_BUFFER_SIZE): BufferedWriter

返回一个BufferedWriter用于写入此文件。

printWrite() public inline fun File.printWriter(charset: Charset = Charsets.UTF_8): PrintWriter
val file = File("m:\\demo.txt")

fun read() {
    println(file.readText())    //段落之间有换行
    file.readLines().forEach(::println)
    file.forEachLine { println(it) }
    file.forEachBlock { buffer, bytesRead -> print(buffer.decodeToString()) }
    file.bufferedReader().use { it.readLines().forEach(::println) }
    file.inputStream().use {
        //一个个读取太慢
//        var num: Int
//        while (it.read().also { num = it } != -1) {
//            print(num.toChar())
//        }
//    }
        val arr = ByteArray(1024)
        var num: Int
        while (it.read(arr).also { num = it } != -1) {
            print(arr.decodeToString(0, num))  //使用num而不是arr.size是因为最后一次读取不一定能读满,不然后面全时空格
//            print(String(arr, 0, num))    //效果同上
        }
    }

}

fun write() {
    //覆盖
    file.writeBytes("writeBytes\n".toByteArray())
    file.writeText("writeText\n")
    file.outputStream().use { it.write("outputStream\n".toByteArray()) }
    file.printWriter().use { it.println("printlnWriter") }
    file.bufferedWriter().use { it.write("bufferedWriter") }
    //追加
    file.appendBytes("appendBytes".toByteArray())
    file.appendText("appendText")

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin - 文件类 File 的相关文章

随机推荐

  • Shell脚本编写教程

    Shell脚本编写教程
  • 为什么栈的数组长度必须是一个常量?而堆的数组长度可以是变量。为什么栈的大小有限制?

    为什么栈的数组长度必须是一个常量 而堆的数组长度可以是变量 栈区数组长度使用变量会报错 其原因就在于栈是编译器管理的 在程序运行前就已经分配好了空间的大小 而使用变量 编译器无法知道该分配多大的内存空间 于是报错 但堆上的内存是动态创建的
  • Scala简介

    目录 一 Scala简介 1 1 概念 1 2 特点 1 3 Scala的优点 二 Scala基本数据类型和运算符 一 数据类型 1 1 类型支持 1 2 定义变量 1 3 类型推断 1 4 Scala解释器 二 字面量 2 1 整数字面量
  • linux系统安装五笔输入法,Linux下安装五笔输入法

    想体验一下Ubuntu10 10 由于我在Windows下用惯了五笔输入法 装上Ubuntu后一直为装不上理想的五笔输入法而烦恼 幸得高人帮忙 才解决了这一难题 心里那个是痛快啊 开始在网上搜索 查得的结果不尽如人意 一会缺少这个 一会又得
  • R-CNN史上最全讲解

    文章目录 一 初识R CNN 网络结构 二 训练步骤 1 RP的确定 2 模型pre training 3 Fine Tunning 4 提取并保存RP的特征向量 5 SVM的训练 6 bbox regression的训练 三 测试步骤 s
  • MySQL8--Windows下使用msi(图形界面)安装的方法

    原文网址 MySQL8 Windows下使用msi 图形界面 安装的方法 的博客 CSDN博客 简介 本文介绍Windows使用图形界面安装MySQL8的方法 下载地址 1 网址入口 进入MySQL的官方网站 https dev mysql
  • 后端开发缓存篇之缓存及缓存模式的介绍

    一 什么是缓存 缓存 简单说就是为了节约对原始资源重复获取的开销 而将结果数据副本存放起来以供获取的方式 二 什么时候使用缓存 1 以 幂等和安全的方式对资源的获取操作 2 缓存数据必须是重复获取的 缓存能生效的本质是空间换时间 缓存的命中
  • Centos 7 升级Openssh7.4到9.2

    本次使用在线升级 因此要求系统yum wget等功能能正常使用 环境 cat etc redhat release CentOS Linux release 7 6 1810 Core ssh V OpenSSH 7 4p1 OpenSSL
  • wired xdisplay只能复制无法拓展

    我出现的问题是ipad可以复制屏幕 但是在系统显示设置中却没有显示有第二块屏幕 如果显示有第二块屏幕 直接win p调成拓展就可以解决了 如果出现的问题和我一样 可以按下面步骤解决 1 ipad和桌面端连接 2 PC端xDisplay 高级
  • 微软和Facebook推出Docs.com

    来源 德胜网 4月22日 据国外媒体报道 Facebook和微软在联手一项在线文件共享服务 看起来多一点像Google Docs 周三在Facebook的F8会议Docs com上线 该网站允许Facebook用户使用Facebook连接登
  • 2.虚拟机CentOS7.6安装SOA

    1 安装JDK8 1 1检查是否自带OpenJDK rpm qa grep jdk 卸载openjdk sudo yum y remove java openjdk 验证是否卸载了openjdk 1 2上传安装包 解压安装包 tar zxv
  • Seata源码分析——@GlobalTransactional

    Seata源码分析 GlobalTransactional 前言 脑图 Seata三大角色 GlobalTransactional 源码入口 GlobalTransactionScanner 初始化TM RM wrapIfNecessary
  • 软考:中级软件设计师:多媒体基础,音频,图像,颜色,多媒体技术的种类,图像音频视频的容量计算,常见的多媒体标准

    软考 中级软件设计师 多媒体基础 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域知识 要熟
  • 第24讲 Python 复数数据类型详解(complex)

    您的 关注 和 点赞 是认可 是支持 是动力 如意见相佐 可留言 本人必将竭尽全力试图做到准确和全面 终其一生进行修改补充更新 本文首发在IT羊资源网 IT羊资源网 网址 https www ityangzy com IT羊资源网是IT世界
  • 我30岁了,转行学编程可以吗? 排除法告诉你答案 ...

    我30岁了 转行学编程可以吗 排除法告诉你答案 白月黑羽网站的读者在群里问过好几次 这个问题 但是这个问题太笼统了 其实不好回答 白月黑羽的这篇博客将根据的你的自身状况 不断的添加 自身条件的假设 采用排除法 认真的回答这个问题 既然有 转
  • ImageJ按照Little-Endian格式存储raw文件

    opencv图像处理是针对little endian数据 多帧堆叠情况下 否则结果错误 下面介绍如何用imageJ存储raw 参考 https imagej nih gov ij docs menus file html 1 在ImageJ
  • 毕设 STM32的FRID高速收费系统(源码+硬件+论文)

    文章目录 0 前言 1 主要功能 2 系统架构 3 硬件设计原理图 4 软件设计流程 称重模块HX711模块子流程 步进电机子流程 5 关键代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和
  • Python库这么多,如何记住呢?

    大家不要着急去收藏Python库 了解python的一些常用库就可以了 具体学到什么方向可以找个项目直接做 过程中接触到什么库再去学 下面给大家介绍几种查找Python库的方法 一 查看官方文档 要知道有哪些 大家可以查看官方文档 比如常用
  • 关键字static的理解

    1 概念 像在VB C C C Java PHP Objective C JavaScript中我们可以看到static作为关键字和函数出现 在其他的高级计算机语言如FORTRAN ALGOL COBOL BASIC LISP SNOBOL
  • Kotlin - 文件类 File

    文件操作 遍历 walk 自上而下 深度优先 遍历整个文件夹 walkBottomUp 自下而上的顺序遍历文件目录和内容 walkTopDown 自上而下的顺序遍历文件目录和内容 名称 extension 文件名的后缀格式 不包含 例如 m