1.IO流
1.1概念
磁盘上的文件和内存之间进行交互需要媒介或者管道,把这个管道或者媒介成为IO流,也成为输入、输出流
输入:从外部存储设备到内存叫输入或读取
输出:从内存到外部存储设备叫输出或写入
1.2流的作用和原理
流的本质就是数据传输,根据数据传输特性将流抽象为各种类,方便更直观(扯淡)的进行数据操作
1.3 IO流的种类
(1)按照流的方向分:输入流、输出流
(2)按照处理单位分:字节流、字符流
字节流: 将数据以字节的形式传输,一次性传输一个字节数据
字符流: 将数据以字符的形式传输,一次性传输一个字符(utf-8编码 1、2或3个字节)
(3)按照功能分:节点流、处理流
节点流: 可以从一个特定的地方(节点)读写字节数据(例如:FileInputStream FileOutputStrean FileReader FileWriter )
处理流: 是对一个已经存在的流的连接和封装,通过所封装的流的功能调用实现数据读写,所以处理流的构造方法总是要带一个其他的流对象做参数。(例如:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter)
1.4字节输入流(InputStream)
InputStream是一个抽象类,不能实例化对象
它的子类:文件输入流 FileInputStream
public static void main(String[] args) throws Exception{
//1.创建流
FileInputStream fis=new FileInputStream("g:\\gp4.txt");
//2.读取文件
//2.1一次读取一个
/*int data=-1;
//一次读一个字节所以有多少字节就读多少次
while ((data=fis.read())!=-1){
System.out.print((char)data);
}*/
//2.2一次读取多个
byte[] buf=new byte[1024*4];
int len=-1;
//一次读取多个,while循环表示读取的次数
while ((len=fis.read(buf))!=-1){
//for循环表示每次读取的元素
for (int i = 0; i <len ; i++) {
System.out.print((char)buf[i]);
}
}
//3.关闭
fis.close();
}
1.5字节输出流(OutputStream)
OutputStream是一个抽象类,不能实例化对象
它的子类: 文件输出流 FileOutputStream
public static void main(String[] args) throws Exception{
//1.创建输出流
true表示可以添加,false表示不可以添加会将原来的结果覆盖掉
FileOutputStream fos=new FileOutputStream("g:\\info.txt",true);
//2.写入
String content="helloworld\r\n";
fos.write(content.getBytes());
fos.write(97);//这里写入的是a
//3.关闭
fos.close();
System.out.println("写入完毕");
}
1.6字符输入流(Reader)
是所有字符输入流的父类,是一个抽象类,不能实例化对象
使用它的子类FileReader类实例化
注意:这里读取时编码格式要对应否则就会出现乱码现象
public static void main(String[] args) throws Exception{
//1.创建流
FileReader reader=new FileReader("g:\\gp4.txt");
//2.读取
int data=-1;
while ((data=reader.read())!=-1){
System.out.print((char)data);
}
//3.关闭
reader.close();
}
1.7字符输出流(Writer)
是所有字符输出类的父类,是一个抽象类,不能实例化
使用它的子类FileWriter类实例化
public static void main(String[] args) throws Exception{
//1.创建字符输出流
FileWriter fw=new FileWriter("g:\\info.txt");
//2.写入
for (int i = 0; i <10; i++) {
fw.write("好好学习,天天向上\r\n");
fw.flush();//缓存刷新
}
//3.关闭
fw.close();
System.out.println("执行完成");
}
1.8 扩展案例:
(1)使用字节流复制文件
public static void main(String[] args) throws Exception{
//1.创建字节输入流
FileInputStream fis=new FileInputStream("g:\\gp4.txt");
FileOutputStream fos = new FileOutputStream("g:\\gp5.txt");
//2.读取和写入
byte[] buf=new byte[1024*4];
int len=-1;
while ((len=fis.read(buf))!=-1){
fos.write(buf,0,len);
}
//3.关闭
fis.close();
fos.close();
System.out.println("复制完毕");
}
(2)使用字符流复制文件
public static void main(String[] args) throws Exception{
FileReader fr=new FileReader("g:\\info.txt");
FileWriter fw=new FileWriter("g:\\info1.txt");
char[] buf=new char[1024*4];
int len=-1;
while ((len=fr.read(buf))!=-1){
fw.write(buf, 0, len);
}
fr.close();
fw.close();
System.out.println("复制完成");
}
1.9 总结
如果复制的文件是文本文件,用字节流和字符流都可以
如果复制的文件是图片、音乐和电影,使用字节流