Kotlin IO操作

2023-11-10

前段时间学习了一点内容,写了一篇Groovy开发工具包
。我当时就在想Kotlin怎么没有好用的文件操作API呢?后来我发现我太傻了,Kotlin这么好用的语言怎么可能没有自己的文件API呢?

Kotlin的IO操作都在kotlin.io包下。Kotlin的原则就是Java有的就直接利用,没有的才自己想办法写。因此Kotlin的IO操作主要是依靠扩展方法,在原有的Java类上添加功能实现的。这一点倒是和Groovy有点像。

下面介绍的很多方法都有一个Charset参数,可以直接要使用的字符集,默认是UTF-8。如果需要其他的字符集,用这个参数指定就行了。

终端IO

如果学过C++的同学可能会对Java超长的输出语句System.out.println()所震惊。同样的工作在C++里面只需要简单的cout<<就可以完成。

幸好,在Kotlin里面很简单,只需要使用println或者print这两个全局函数即可。我们不再需要冗长的前缀。

从终端读取数据也很简单,最基本的方法就是全局函数readLine,它直接从终端读取一行作为字符串。如果需要更进一步的处理,可以使用Kotlin提供的各种字符串处理函数来处理和转换字符串。

文件IO

Kotlin为java.io.File提供了大量好用的扩展方法,详细的扩展方法见这里java.io.File。这里我就跳着说几个最常用最好用的吧。

首先先看读取文件。如果需要简单读取一个文件,可以使用readText()方法,它直接返回了整个文件内容。如果希望按行读取,还可以使用readLines()方法,这会返回一个行字符串数组,我们可以随意操作。如果希望直接操作字节数组,那就使用readBytes()。如果想使用传统的Java方式,Kotlin也能满足你。

fun readFile() {
    val filename = """C:\Windows\System32\drivers\etc\hosts"""
    val file = File(filename)
    val contents = file.readText()
    println(contents)

    //大写前三行
    file.readLines().take(3).forEach {
        println(it.toUpperCase())
    }

    //直接处理行
    file.forEachLine(action = ::println)

    //读取为bytes
    val bytes: ByteArray = file.readBytes()
    println(bytes.joinToString(separator = ""))

    //直接处理Reader或InputStream
    val reader: Reader = file.reader()
    val inputStream: InputStream = file.inputStream()
    val bufferedReader: BufferedReader = file.bufferedReader()
}

和读取文件类似,写入文件也很简单。我们可以写入字符串,也可以写入字节流。还可以直接使用Java的Writer或者OutputStream。

fun writeFile() {
    val currentDir = System.getProperty("user.dir") + "\\out"
    val file = File(currentDir, "hehe.txt")
    file.writeText("呵呵呵哈哈哈")
    println(file.readText())

    file.writeBytes(byteArrayOf(12, 56, 83, 57))
    println(file.readText())

    //追加方式写入字节或字符
    file.appendBytes(byteArrayOf(93, 85, 74, 93))
    file.appendText("吼啊")
    println(file.readText())

    //直接使用writer和outputstream
    val writer: Writer = file.writer()
    val outputStream: OutputStream = file.outputStream()
    val printWriter: PrintWriter = file.printWriter()

}

遍历文件树

和Groovy一样,Kotlin也提供了方便的功能来遍历文件树。遍历文件树需要调用扩展方法walk()。它会返回一个FileTreeWalk对象,它有一些方法用于设置遍历方向和深度,详情参见FileTreeWalk

下面的例子遍历了指定文件夹下的所有可执行文件。

fun traverseFileTree() {
    val systemDir = File("""C:\Windows""")
    val fileTree: FileTreeWalk = systemDir.walk()
    fileTree.maxDepth(1)
            .filter { it.isFile }
            .filter { it.extension == "exe" }
            .forEach(::println)

}

网络IO

Kotlin为java.net.URL增加了两个扩展方法,readBytesreadText。我们可以方便的使用这两个方法配合正则表达式实现网络爬虫的功能。

下面第一个例子简单的获取了百度首页的源代码。第二个例子先获取了必应首页图片的XML格式信息,然后通过正则表达式和分组获取图片的相对URL并组合出实际URL,然后调用readBytes()方法读取到字节流并写入文件。

fun readFromNet() {
    //返回百度首页
    val baidu = URL("http://www.baidu.com")
    val contents = baidu.readText()
    //println(contents)

    //获取必应首页图片并保存
    //获取XML格式图片信息
    val bing = URL("http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US")
    val texts = bing.readText()
    //获取url地址和文件名
    val regex = Regex("""<url>(.*)</url>""")
    val result = regex.find(texts)
    val imageUrl = "http://www.bing.com" + result!!.groupValues[1]
    val filename = imageUrl.substring(imageUrl.lastIndexOf('/'))
    //写入文件
    val output = File(System.getProperty("user.dir") + "\\out", filename)
    val requestUrl = URL(imageUrl)
    output.writeBytes(requestUrl.readBytes())

}

在项目相应文件夹下我们可以看到下载好的图片。

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

Kotlin IO操作 的相关文章

随机推荐

  • 22. 协程与Python中的多任务异步协程

    目录 前言 协程概念 示例代码 Python编写协程程序 要用到的库函数 尝试编写异步 尝试改进函数 尝试优化代码 在爬虫领域的应用 总结 前言 本节我们介绍一个新概念 协程 协程顾名思义 是协助执行程序的过程 我们将介绍协程的概念和其在P
  • 静态地址重定位 与 动态地址重定位

    静态地址重定位 即在程序装入内存的过程中完成 是指在程序开始运行前 程序中的各个地址有关的项均已完成重定位 地址变换通常是在装入时一次完成的 以后不再改变 故成为静态重定位 优点 无需硬件支持 缺点 1 程序重定位之后就不能在内存中搬动了
  • QT定时器的使用

    QT定时器的使用 使用QTimer定时器类 1 首先创建一个定时器类的对象 QTimer timer new QTimer this 2 timer 超时后会发出timeout 信号 所以在创建好定时器对象后给其建立信号与槽 connect
  • jenkins学习笔记第五篇使用参数化解决ant+jemeter生成报告问题

    jenkins插件还是很强大的 这里用到的插件是Date Parameter 在参数化构建过程中添加参数 这里具体使用如下 可以在项目构建里 添加shell 具体引入方式如 echo DateParameter 在windows下使用的是w
  • windows node.js二进制文件的下载与配置

    1 下载 下载地址 http nodejs cn download 根据自己的电脑下载 2 将压缩包解压到你想安装的位置 3 在解压之后的文件夹中创建两个文件夹 node global npm全局安装位置 和node cache npm 缓
  • 使用Aspose在C#中将PLT转换为PDF或JPEG图像

    PLT是用于绘图仪机器的基于矢量的格式 但是 只有少数应用程序支持此格式 因此可能需要根据需要转换为更兼容的格式 使用Aspose只需几个简单的步骤即可将PLT文件转换为PDF PNG或JPEG图像 让我们学习以下部分以获取更多详细信息 在
  • 微信支付报错:用户传入的appid不正确,请联系商户处理

    微信APP支付的时候 报用户传入的appid不正确 请联系商户处理错误 解决方案 1 确保所有配置正确 2 可以检查一下签名的大小写
  • Kali--MSF-永恒之蓝详解(复现、演示、远程、后门、加壳、修复)

    目录 一 永恒之蓝概述 二 SMB协议 三 准备工作 四 漏洞复现 1 主机发现 2 端口扫描 3 利用模块 五 演示功能 1 获取cmd 2 捕获屏幕 3 上传文件 4 下载文件 5 远程登录 6 上传后门 7 免杀加壳 8 运行wann
  • 开博说明

    新开博客 开博说明 开博说明 大家好 这是我个人第一个技术博客 由于本人工作涉及金融量化方面 我会在今后的博客中主要涉及如下内容 方便有志之士一起探讨学习 也方便我个人查漏补缺 谢谢 python pandas sklearn tensor
  • MATLAB生成 FPGA代码

    写作时间 2020 12 13 标题 使用 HDL Coder 将 MATLAB 转换为 FPGA 目录 1 从 MATLAB 生成 HDL 代码 2 MATLAB 到硬件工作流 3 MATLAB 算法示例 正文 1 从 MATLAB 生成
  • PyQt4编程之如何做菜单栏

    菜单栏是大部分软件都有的 菜单栏能提供便捷的帮助 记事本的菜单栏就是最简单的一个例子 等过几天我会写记事本的菜单栏了再另外发代码出来 下面的代码是Copy的 import sys from PyQt4 import QtGui QtCore
  • Python2,python3调用face++api

    由于官网给的api只能支持python2 然而自己改成3的话特别麻烦 花了两三天都没有改好 查阅各种资料都没有结果 今天偶遇一代码 非常感谢这位博主 现将其代码和我的使用样例献上 希望能够帮助到和我一样的小白 该博主的代码 Face API
  • 用Lex(flex)和yacc(bison)写的简单计算器

    Lex文件如下 include cal tab h option noyywrapinteger 0 9 dreal 0 9 0 9 ereal 0 9 0 9 EedD 0 9 real dreal ereal nl nplus minu
  • 使用ipv6内网穿透,实现私有云盘搭建,实现远程控制等功能

    文章目录 问题 获得计算机的ipv6地址 ipv6变化问题 解决 桌面远程控制 ipv6控制路由器 解决 私有云盘搭建 创建服务端B的环境配置 创建服务端可以访问的用户账户 配置服务器对ipv6地址访问的监听 创建ipv6访问客户端 NAT
  • ubuntu使用docker安装jdk和tomcat (一)

    Docker是一个开源的引擎 可以轻松的为任何应用创建一个轻量级的 可移植的 自给自足的容器 开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署 包括VMs 虚拟机 bare metal OpenStack 集群和其他的基础应用平
  • IP地址的组成和划分(3)

    文章目录 一 IP地址组成 二 IP地址的划分 1 A类地址 2 B类地址 3 C类地址 4 D类地址 5 E类地址 一 IP地址组成 IP地址由4部分数字组成 每部分数字对应于8位二进制数字 各部分之间用小数点分开 这是点分二进制 如果换
  • 解决mysql不是内部或外部命令 环境变量 并且

    安装Mysql后 当我们在cmd中敲入mysql时会出现 Mysql 不是内部或外部命令 也不是可运行的程序或其处理文件 打开我的电脑在我的电脑右键中选择属性 然后单击选择高级系统设置 在系统属性的 高级 中选择环境变量path 选择Mys
  • 宏观经济浅学20210711

    M2 大类资产配置 GDP 周期 https www bilibili com video BV1V5411e76f from search seid 3336101618933886388 宏观经济站把控 统治地位 宏观经济研究 经济为什
  • 三合一浴霸必须一直接通取暖开关才能控制照明和风扇的解决方法

    刚新租了一个二室房子 入住后发现这样一个奇怪的问题 要想只让三合一 照明 取暖 通风 浴霸只照明或者只通风 必须得把取暖打开才行 并且取暖必须一直打开 否则一旦断开 照明和取暖也用不了了 头一次遇见这样的问题 首先怀疑是否是浴霸就是这么设计
  • Kotlin IO操作

    前段时间学习了一点内容 写了一篇Groovy开发工具包 我当时就在想Kotlin怎么没有好用的文件操作API呢 后来我发现我太傻了 Kotlin这么好用的语言怎么可能没有自己的文件API呢 Kotlin的IO操作都在kotlin io包下