一、什么是IO流
- IO流即存储和读取文件数据的解决方案
- I:input即程序读取文件数据
- O:output即程序写出文件数据
- 因为IO流在工作时像流水一般通过字节或则字符读取或写出数据的所以成为IO流
- IO流分为字符流和字节流,字符流只能处理纯文本文件,字节流能处理所有文件
二、IO流的使用
1、字节输入输出流
a.txt原本内容为
defg
public class FileIOStream {
public static void main(String[] args) throws IOException {
String str = "abc";
//创建输出流第二个参数为true开启续写
FileOutputStream fos = new FileOutputStream("a.txt", true);
//将字符串转化成字节写入文件
fos.write(str.getBytes());
//关闭资源占用
fos.close();
//创建第二个输出流用于拷贝
FileOutputStream copyFos = new FileOutputStream("b.txt");
//创建读取流
FileInputStream fis = new FileInputStream("a.txt");
//创建一个字节数组容器用于读取
byte[] bytes = new byte[3];
//记录读取长度
int len;
//传入字节数组容器,如果不传则返回1个字节不返回长度
while ((len = fis.read(bytes)) != -1 ){
//输出并将数据写入b.txt文件写入长度为读取到的数据字节长度
System.out.println(new String(bytes, 0, len));
copyFos.write(bytes, 0, len);
}
}
}
运行后a.txt
defg
abc
b.txt
defg
abc
注意:使用字节输入流读取中文时容易出现乱码,像这样:
a.txt
a啊这
再运行以上代码打印出
a�
��
�
idea默认使用的时Unicode的utf-8编码格式,中文字符占3个字节。
如果是GBK编码则中文占用两个字节
String str = "a啊这";
System.out.println(Arrays.toString(str.getBytes()));//UTF-8
System.out.println(Arrays.toString(str.getBytes("GBK")));//GBK
输出结果: [97, -27, -107, -118, -24, -65, -103]
[97, -80, -95, -43, -30]
示例代码中每次读取3个字节
第一次读取到了a和三分之二个“啊”字
第二次读取三分之一的“啊”和三分之二的“这”
第三次读取剩下的三分之一的“这”
2、字符输入流
使用字符流读取时,字符流就会帮助我们检查编码规则。
public class ReaderTest {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("a.txt");
int a;
while ((a = fileReader.read()) != -1){
System.out.println((char)a);
}
fileReader.close();
}
}
输出内容:a
啊
这
需要注意的时字符流读取数据会将读取到的二进制码转变成十进制,我们把(char)强转删除就能看到。
输出内容:97
21834
36825
字符流在初始化时会创建一个长度为8192字节(8KB)的字节数组作为缓冲区。
在执行read方法时会从目标文件中试图获取8KB的数据,然后从缓冲区中读取数据。
如果读完则会继续像目标文件获取数据,如果目标文件没有数据了则返回-1。
3、字符输出流
与字符出入流相似,字符输出流也有缓冲区。
字符输出流在执行write方法时会先将数据写入缓冲区而不是直接写入目标文件。
当缓冲区写满(8KB)时数据会一次性从缓冲区写入文件。
除了缓冲区写满,调用flush和close方法也会将缓冲区的数据写入目标文件