文件读写(Java IO)→ Kotlin 扩展函数

文件读写(Java IO)→ Kotlin 扩展函数

老写法(Java)

java 复制代码
// 写入文件
FileOutputStream fos = null;
try {
    fos = context.openFileOutput("data.txt", Context.MODE_PRIVATE);
    fos.write("hello world".getBytes());
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fos != null) {
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 读取文件
FileInputStream fis = null;
BufferedReader reader = null;
StringBuilder sb = new StringBuilder();
try {
    fis = context.openFileInput("data.txt");
    reader = new BufferedReader(new InputStreamReader(fis));
    String line;
    while ((line = reader.readLine()) != null) {
        sb.append(line);
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try { if (reader != null) reader.close(); } catch (IOException ignored) {}
    try { if (fis != null) fis.close(); } catch (IOException ignored) {}
}
String content = sb.toString();

问题在哪里

try-catch-finally 嵌套层层叠叠,实际有用的就两行读写代码,其余全是样板。每次忘记 close 就有泄漏风险,IDE 不一定能检查出来。

新写法(Kotlin)

kotlin 复制代码
// 写入
context.openFileOutput("data.txt", Context.MODE_PRIVATE).use { stream ->
    stream.write("hello world".toByteArray())
}

// 读取
val content = context.openFileInput("data.txt").use { stream ->
    stream.bufferedReader().readText()
}

// 逐行读取
val lines = context.openFileInput("data.txt").use { stream ->
    stream.bufferedReader().readLines()
}

// 写入扩展函数 --- 项目中可以抽成工具方法
fun Context.writeToFile(filename: String, content: String) {
    openFileOutput(filename, Context.MODE_PRIVATE).use {
        it.write(content.toByteArray())
    }
}

fun Context.readFromFile(filename: String): String {
    return openFileInput(filename).use {
        it.bufferedReader().readText()
    }
}

一句话注意

Kotlin 的 .use {} 对应 Java 的 try-with-resources,Closeable 接口的实现类都可以用,lambda 结束后自动调用 close(),不会忘。

bufferedReader() 和 readText() 都是 Kotlin 标准库扩展函数(kotlin.io 包),来自 InputStream 和 Reader 的扩展。不需要额外依赖,Kotlin 标准库自带。

toByteArray() 默认用系统默认字符集(通常是 UTF-8)。如果文件是其他编码,用 toByteArray(Charsets.ISO_8859_1) 之类指定编码。


Java Android 老项目迁移系列,持续更新中。

相关推荐
aqi003 小时前
鸿蒙版本的电子书阅读APP开放源码啦
android·华为·ai编程·harmonyos·鸿蒙
墨天梦3 小时前
B19_SunnyWeather到阅读客户端
android·kotlin
代码什么用4 小时前
Spring基础使用
java·后端·spring
Su米苏4 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
美狐美颜sdk4 小时前
直播APP源码可以直接接入视频美颜sdk吗?技术方案详解
android·人工智能·音视频·美颜sdk·直播美颜sdk
码云数智-园园4 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁4 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网4 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
禾小西5 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨5 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言