摘要:Java基础面试题以及个人总结
I/O流基础知识总结 2
字符流
reader 字符输入流
writer 字符输出流
使用字符流的原因:但我们要读取的文件,字符串含有字符时,如果在不知道该字符对应生成的编码类型是什么就会读取到内存显示的是乱码
所有为了解决,出现了直接操作字符的输入输出流来进行数据的处理
使用范围:
当我们要传输的是视频文件,音频文件时,使用字节输入输出流进行操作
当我们传输的文件是字符,使用字符输入输出流进行操作
常用的字符编码所占的字节数:
- unicode 任何字符都占两个字节
- gbk 英文占一个字节,中文占两个字节
- utf-8 英文占一个字节,中文占三个字节
reader-字符输入流
读取的是文本内容,不是字节内容
常用方法有:
- read()
- read(char[] cbuf)
- read(char[] cbuf,int off ,int length)
- skip(long n)
- close()
inputStreamReader
是字节流转换成字符流的桥梁
原理:
- 读取文件内容,即使是字符,也是以字节的形式进行的、
- 我们的目的是要将文件中的内容读取到内存中,当我们遇到字符内容时,会被计算机解析成字节,我们通过InputStreamReader指定要读取的字节输入流对象FileInputStream(文件的路径),字符集(UTF8,GBK,UNICODE)读取,保证和源文件的字符集一致
- 由于字节输入流是一个字节一个字节进行的读取,而我们的字符是再一些字符集中是以几个字节组成一个字符的,如果对一个字符所对应的字节进行缓冲,存储再字节缓冲区中,再进行统一的解码,就不会出现乱码
- InputStreamReader就有缓冲的功能,缓冲之后,通过字符集解码为字符返回
FileReader
文件字符输入流
是以字符进行的读取
FileReader.read() 读取,返回的是下一个字符的字节数
1 | try (FileReader fileReader = new FileReader("input.txt");) { |
writer-字符输出流
从内存将数据写入到外部存储器中
常见方法:
- writer(int n) 读取当个字符
- writer(char[] cbuf) 写入字符数组
- writer(char[] cbuf, int off ,int len) 写入字符数组,有偏移量和最大字符长度的限制
- writer(String str) 写入字符串
- writer(String str ,int off ,int length)
- append(字符序列 ) 将字符序列追加到writer对象后
- append(char c ) 将指定的字符追加到writer对象后
- flush() 刷新输出流,并将所有的缓冲的输出字符强制写出
- close() 关闭输出流,释放资源
OutputStreamWriter
与InputStreamReader相反,是将字符流转换为字节流的桥梁
FileWriter
1 | 将文件放到文件字符输出流中 |