IO流分类
1)按照流向分类:
输入流:读取数据用的
输出流:写数据用的
2)按照读写的数据分类(体系结构)
<1>字节流[读写任何类型的文件(任何文件底层都是字节数据)]
字节输入流:IntputStream(抽象类)
–FileInuptStream: 读取文件中的字节
–BufferedInputStream: 对InputStream进行包装,提高读取数据的效率
字节输出流: OutputStream(抽象类)
–FileOutputSteam: 往文件中写字节
–BufferedOutputStream: 对OutputStream进行包装,提高写入数据的效率
1)普通字节流复制
//创建流对象
FileInputStream fis = new FileInputStream("文件路径");
FileOutputStream fos = new FileOutputStream("文件路径");
//一次读写多个字节
byte[] bs = new byte[1024]; //1024byte=1kb
int len; //记录每次读取的字节个数
while((len=fis.read(bs))){
//把读取到的有效字节数据,写入目标文件中
fos.write(bs,0,len);
}
//释放资源
fis.close();
fos.close();
2)缓冲字节流复制
//创建流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件路径"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件路径"));
//如果是一次读一个字节,则read返回的是读取的字节
//一次读写多个字节
byte[] bs = new byte[1024]; //1024byte=1kb
int len; //记录每次读取的字节个数,读取的内容存储到字节数组中
while((len=bis.read(bs))!=-1){
//把读取到的有效字节数据,写入目标文件中
bos.write(bs,0,len);
}
//释放资源
bis.close();
bos.close();
<2>字符流[只能读取文本文件(用记事本打开能读懂的就是文本文件)]
字符输入流:Reader(抽象类)
–FileReader: 读取文件中的字符数据
–BufferedReader: 对FileReader进行包装,提高读取字符的效率
字节输出流: Writer(抽象类)
–FileWriter: 往文件中写字符数据
–BufferedWriter: 对FileWriter进行包装,提高写入字符的效率
1)普通字符流复制
//创建流对象
FileReader fr = new FileReader("文件路径");
FileWriter fw = new FileWriter("文件路径");
//一次读写多个字符
char[] bs = new char[1024]; //1024byte=1kb
int len; //记录每次读取的字节个数
while((len=fr.read(bs))!=-1){
//把读取到的有效字节数据,写入目标文件中
fw.write(bs,0,len);
}
//释放资源
fr.close();
fw.close();
2)字符缓冲流复制
//创建流对象
BuferedReader br = new BufferedReader(new FileReader("文件路径"));
BuferedWriter bw = new BuferedWriter(new FileWriter("文件路径"));
//一次读一行
String line; //记录每次读取的那一行
while((line=br.readLine())!=null){
//把读取到的有效字节数据,写入目标文件中
bw.write(line);
bw.newLine(); //换行,具备跨平台性
bw.flush; // 刷新
}
//释放资源
br.close();
bw.close();
3)字节流以及字符流的注意事项:
<1>为什么字节流读取文本文件,可能会出现乱码?
字节流一次读一个字节,而不管GBK还是UTF-8一个中文都是多个字节,用字节流每次只能读其中的一部分,所以就会出现乱码问题。
<2>字符流怎么解决乱码问题
通过字符串的getBytes(“码表名”) 和 new String(byte1, “码表名”)进行编码和解码
<3>字符流写数据
a.创建字符输出流对象:如果文件不存在,就新建,但是要保证父级路径的存在
如果文件存在就清空
b.写数据:写出int类型的整数,实际写出的是整数在码表上对应的字母
写出字符串数据,是把字符串本身原样写出。
<4>字符流底层为【字节流+编码表】