文件的输入流用于从文件中读取数据,输出流是将数据写入文件中。文件的类型又分为二进制的图片、音视频及人可以看懂的文字这两种。第一种类型的文件的读写就要通过字节输入输出流才能进行读取而第二种的话多用字符输入输出流来操作。
2.字节输入输出流的基本操作:
val inputStream: InputStream = FileInputStream("file.txt")
val byte: Int = inputStream.read() // 读取单个字节
val byteArray: ByteArray = ByteArray(1024)
val bytesRead: Int = inputStream.read(byteArray) // 读取多个字节到数组
val outputStream: OutputStream = FileOutputStream("file.txt")
outputStream.write(byte) // 写入单个字节
outputStream.write(byteArray) // 写入字节数组
inputStream.close()
outputStream.close()
当然为了提高效率我们这里可以使用缓冲流BufferedOutputStream/BufferedInputStream,通过缓冲区高效读取和写入文件。
val bufferedInputStream: BufferedInputStream = BufferedInputStream(FileInputStream("file.txt"))
val bufferedOutputStream: BufferedOutputStream = BufferedOutputStream(FileOutputStream("file.txt"))
3.字符输入输出流基本操作
从文件读取字符流
val reader = FileReader("file.txt")
var char: Int = reader.read()//每次读取的字符长度
while (char != -1) {
char = reader.read()//保存读取的字符
}
reader.close()//关闭流
写入字符流到文件
val writer = FileWriter("file.txt") writer.write("Hello, World!")//写入字符串 writer.write(200)//写入整数 writer.close()//关闭流
用缓冲器流类高效写入读取
val reader = BufferedReader(FileReader("myfile.txt"))//使用缓冲流
var rline: String? = reader.readLine()
while (line != null) {
rline = reader.readLine()//逐行读取
}
reader.close()//关闭流
3文件的其他操作
1.检查文件是否存在
file.exists()
2.获取应用程序的内部文件目录的路径
filesDir.path
实例(以用户登录实例中的读取用户信息为例):
//获取文件路径
private fun filePath(context:Context):String{
return "${context.filesDir.path}/userInfo"
}
//判断文件路径是否存在
private fun fileExist(path:String):Boolean{
val file = File(path)
return file.exists()
}
fun readData(context: Context):List<User>{
if (fileExist(filePath(context))) {//判断文件路径是否存在
FileReader(filePath(context)).use {
val jsonString = it.readText()
val token = object : TypeToken<List<User>>() {}
return Gson().fromJson(jsonString, token)
}
}
return emptyList()
}