设为首页 加入收藏

TOP

Kotlin入门(27)文件读写操作(一)
2019-09-01 23:26:37 】 浏览:66
Tags:Kotlin 入门 文件 读写 操作

Java的文件处理用到了io库java.io,该库虽然功能强大,但是与文件内容的交互还得通过输入输出流中转,致使文件读写操作颇为繁琐。因此,开发者通常得自己重新封装一个文件存取的工具类,以便在日常开发中调用。下面是一个文件工具类的简单Java代码:

public class FileUtil {

	//保存文本文件
	public static void saveText(String path, String txt) {
		try {
			FileOutputStream fos = new FileOutputStream(path);
			fos.write(txt.getBytes());
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//读取文本文件
	public static String openText(String path) {
		String readStr = "";
		try {
			FileInputStream fis = new FileInputStream(path);
			byte[] b = new byte[fis.available()];
			fis.read(b);
			readStr = new String(b);
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return readStr;
	}
}

从上述代码看到,仅仅是文本文件的内容保存和读取,就得规规矩矩写这么多行代码,并且还不太容易理解,对于新手来说着实不够友好。哪里有痛点,哪里就有优化,所以Kotlin在文件API这块也下了一番功夫,它以Java的io库为基础,利用扩展函数,添加了一些常用的文件内容读写方法,并且往往是一行代码便搞定功能,绝不拖泥带水。

比如把一段文本写入文本文件,只消调用File对象的writeText方法,即可实现写入文本的功能。真的只要一行代码,就像下面这样:

    //把文本写入文件
    File(file_path).writeText(content)

 

如此简洁又好用的代码,想必是许多开发者梦寐以求的。当然了,Kotlin同样支持其它格式的数据写入,前面的writeText方法是覆盖写入文本,如果要往源文件追加文本,则可调用appendText方法。另外像图片等二进制格式的文件,可通过字节数组的形式写入文件,Kotlin提供了writeBytes方法用于覆盖写入字节数组,也提供了appendBytes方法用于追加字节数组。不过由于图像存储比较特殊,牵涉到压缩格式与压缩质量,因此还得通过输出流来处理(这是Bitmap的compress方法要求的),具体的图片文件写入代码如下所示:

    fun saveImage(path: String, bitmap: Bitmap) {
        try {
            val file = File(path)
            //outputStream获取文件的输出流对象
            //writer获取文件的Writer对象
            //printWriter获取文件的PrintWriter对象
            val fos: OutputStream = file.outputStream()
            //压缩格式为JPEG图像,压缩质量为80%
            bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos)
            fos.flush()
            fos.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

看过了文件的写入操作,再来看看文件的读取操作。有了writeText方法带好头,Kotlin又提供了以下几个好看且好用的文件内容读取方法:

readText : 读取文本形式的文件内容。
readLines : 按行读取文件内容。返回一个字符串的List,文件有多少行,队列中就有多少个元素。
readBytes : 读取字节数组形式的文件内容。
这几个方法理解起来毫不费力,从文件中读取全部的文本,也只要下面一行代码便成:

    //读取文件的文本内容
    val content = File(file_path).readText()

若想从图片文件中读取位图信息,按上面的函数说明,应能调用readBytes方法。该办法确实可行,因为Android的位图工厂BitmapFactory刚好提供了decodeByteArray函数,用于从字节数组中解析位图,具体代码如下所示:

    //方式一:利用字节数组读取位图
    //readBytes读取字节数组形式的文件内容
    val bytes = File(file_path).readBytes()
    //decodeByteArray从字节数组解析图片
    val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)

 

之前提到将位图保存为图片文件时,通过输出流进行处理;那么反过来,从图片文件读取位图数据,也可通过输入流来完成。当然多亏了BitmapFactory的decodeStream方法,使得输入流解析位图能够变成现实,以下便是输入流方式读取图片的代码例子:

    //方式二:利用输入流读取位图
    //inputStream获取文件的输入流对象
    val fis = File(file_path).inputStream()
    //decodeStream从输入流解析图片
    val bitmap = BitmapFactory.decodeStream(fis)
    fis.close()

 

前两种读取图片文件的方式,其实都包含两个步骤:先从File对象获得文件内容,再利用位图工厂解码成位图。尽管这么做也只需两行代码,还是不如读取文本的一行代码来得精炼,对于精益求精的开发者来说,此处仍然有着改善的空间。幸好位图工厂留了一手终极大招,名叫decodeFile,只要给出图片文件的完整路径,文件读取和位图解析的操作都一齐搞定了,具体代码见下:

    //方式三:直接从文件路径获取位图
    //decodeFile从指定路径解析图片
    val bitmap = BitmapFactory.decodeFile(file_path)

 

真是想不到,光光从图片读取位图数据这个小功能,就有至少三种方式,不但学到了Kotlin的文件读取API,而且温习了Android的BitmapFactory类。开发者的口味各不相同,不管个人的偏好写法是啥,以上三种方式总有一款适合你。

写文件和读文件是处理单个文件,没有太复杂的需求。倘若要求遍历某个目录下面的所有文本文件或者图片文件,那可麻烦了,因为该功能的需求点可丰富了,例如要不要到子目录和孙子目录下搜索、文件跟文件夹都要匹配还是只匹配其中之一、筛选条件的文件扩展名都有哪些?想想这些详细的功能点都觉得头大,就算好不容易把符合条件的文件都挑出来,末

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇继续封装个 Volley 组件 下一篇Android远程桌面助手(B1371)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目