前段时间学习了一点内容,写了一篇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)//读取为bytesval bytes: ByteArray = file.readBytes()println(bytes.joinToString(separator = ""))//直接处理Reader或InputStreamval 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和outputstreamval 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())}

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

Kotlin IO操作相关推荐

  1. [零基础学JAVA]Java SE应用部分-27.Java IO操作(01)

    JAVA IO操作目标 本季知识点 1.File类 2.RandomAccessFile类 File类 在JAVA中所有的IO操作全部存放在java.io包中. File是唯一一个与文件本身有关的操作 ...

  2. java中的IO操作总结(一)

    转载:http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.html    所谓IO,也就是Input与Output的缩写.在java中 ...

  3. python和R文件IO操作对比及dataframe创建方式对比:read_csv、to_csv、write.csv、 data.frame、pd.DataFrame

    python和R文件IO操作对比及dataframe创建方式对比 很多工程师可能刚开始的时候只熟悉python或者R其中的一个进行数据科学相关的任务. 那么如果我们对比这学习可以快速了解语言设计背后的 ...

  4. CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占

    CPU被夺走的三种状态   .                           cpu的三种状态之              运行态      就绪态等待被调用             阻塞态 i ...

  5. python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...

    IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...

  6. .NET中的IO操作基础介绍

    关于IO简介 .NET中的IO操作,经常需要调用一下几个类. 1.FileStream类        文件流类,负责大文件的拷贝,读写. 2.Path类                   Path ...

  7. 提高生产力:文件和IO操作(ApacheCommonsIO-汉化分享)

    复制.移动.删除.比较.监控.文件读写 等文件和IO操作是编程中比较常用的功能. 幸运的是,Apache Commons IO等开源组件已经帮我们实现了.        我们可以不用重复造轮子了. 1 ...

  8. 对CPU的IO操作的理解

    什么是io操作 读写cpu寄存器,cache之外的设备叫做cpu的io操作,如内存,硬盘,网卡,但是读写内存很快,一般不将读写内存叫做io操作.

  9. C++ Primer 5th笔记(chap 17 标准库特殊设施)多字节低层IO操作

    1. 多字节操作 一些未格式化 IO 操作一次处理大块数据,这些操作要求我们自己分配并管理用来保存和提取数据的字符数组 操作 解释 is.get(sink, size, delim) 从is中读取最多 ...

最新文章

  1. 淘淘经受了一次考验...
  2. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
  3. BufferQueue 和 gralloc
  4. TCP多进程并发服务端 Linux socket编程入门(2)
  5. CAN笔记(22) 特殊协议
  6. Flink 上传的Jar包去哪里了
  7. 删除排序数组中的重复数字
  8. spring boot 核心_Spring Boot 的 10 个核心模块
  9. Win10 UWP vs add github
  10. JavaSE思维导图总结
  11. 基于c语言的串口通讯,基于C语言的RS232串行接口通信设计与实现
  12. 转摘--Dism 编辑Windows WIM 文件
  13. Vc++ - qt - 仿照微信聊天窗口 - demov.1.0 初步展示
  14. 各种HIC处理数据之间的相互转化
  15. 利用MQTT协议与阿里云数据交互的python程序
  16. android系统优化启动时间(Google官方推荐)
  17. 探索 OkHttp 原理
  18. webview设置透明度
  19. 电动吞吐式ISO14443ISO15693多功能IC卡磁条读写器M100接口说明
  20. SharePoint 网站集备份与还原

热门文章

  1. r11安卓9系统怎么root,oppo r11s升级安卓9
  2. 通达信二次开发接口api如何操作?
  3. SSL证书失效导致无法上传问题
  4. 加密流量分类-论文11 FlowPic: A Generic Representation for Encrypted Traffic Classification and Applications
  5. Exercise 1.30/1.31/1.32/1.33
  6. 背包DP | 完全背包问题
  7. c语言输入输出方法总结
  8. springCloud出现:Load balancer does not have available server for client: SERVICE-XXX的错误解决方法
  9. AC多模匹配算法小结
  10. EF中的DBFirst实例(上)