一、IO的定义
我们经常会操作磁盘上的资源,这个过程中实现了数据的输入和输出操作,磁盘上的文件和内存进行交互,数据的
交互需要有一个媒介或者管道,我们把这个媒介或者管道就称之为IO流,或者输入、输出流。
输入:从外部设备到内存称为输入(读数据);
输出:从内存到外部设备称为输出(写数据);
二、流的作用和原理
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称和抽象。即数据在两设备间的传输称为流,流
的本质是数据的传输。
三、IO流的种类
1、按流向分:输入流、输出流 (抽象类,不能实例化)
输入流:表示将数据读取到Java程序(内存)中使用的流 InputStream
输出流:表示从java程序(内存)向外传输使用的流 OutputStream
FileInputStream(字节输入流) --------》read()读操作
//创建被操作文件:此文件必须存在,否则读取时,抛出文件找不到异常
File file = new File("test\\hello.txt");
//声明流,不初始化
FileInputStream fis = null;
try {
//初始化流
fis = new FileInputStream(file);
//准备数组用来存储数据
byte[] b = new byte[3];
//先定义一个变量,初始值是-1
int i = -1;
//定义一个计数循环的变量
int count = 0;
//while循环读取
while((i=fis.read(b))!=-1) {
count++;
for(int j=0; j<i; j++) {
System.out.print((char)b[j]);
}
}
System.out.println(count);//计数:计算循环读取的次数
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(fis!=null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FileOutputStream(字节输出流)--------》write()写操作 写完之后需要flush() 刷新流
//向文件中写入数据
//在工程中创建一个test文件夹
//设计程序,向test\\hello.txt中写入hello world
//第一步:创建被操作文件对象
//当向一个文件中写入数据时,若文件不存在,程序会自动创建
File file = new File("test\\hello.txt");
FileOutputStream fos = null;
try {
//第二步:创建流对象
fos = new FileOutputStream(file, true);
//第三步:准备数据
String str = "hello world";
byte[] b = str.getBytes();
System.out.println(b.length);
//第四步:使用流写入
fos.write(b);
}catch(IOException e) {
e.printStackTrace();
} finally {
if(fos!=null) {
try {
//第五步:刷新流,关闭流
fos.flush();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、按照处理数据单位分:字节流、字符流
字节流:一次性传输一个字节数据,将数据以字节的形式传输。 (通常处理视频,音乐,图片等字节文件)
字符流:一次性传输一个字符(utf-8编码1、2或3个字节)数据,将数据以字符的形式传输。(处理含有中文的文件)
Reader类 Writer类
3、按照功能分:节点流、处理流
节点流:可以从或向一个特定的地方(节点)读写字节数据。
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。
字节流复制文件 (用数组传输字节一定得注意最后一此访问,填入字节数不一定正好填满数组)
// 1 使用字节流复制文件
public static void copy1() throws Exception{
//1创建字节文件输入输出流
InputStream is=new FileInputStream("d:\\003.jpg");
OutputStream os=new FileOutputStream("d:\\004.jpg");
//2读、写
byte[] buf=new byte[1024*4];
int len=0;
while((len=is.read(buf))!=-1){
//buf缓冲区,0从第一个位置写,len写的长度
os.write(buf,0,len);
}
//3关闭
is.close();
os.close();
System.out.println("复制完成");
}
字符流复制文件
//2使用字符流复制文件
public static void copy2() throws Exception{
//1创建字符输入输出流
Reader reader=new FileReader("d:\\003.jpg");
Writer writer=new FileWriter("d:\\005.jpg");
//2读写
char[] buf=new char[1024*4];
int len=0;
while((len=reader.read(buf))!=-1){
writer.write(buf, 0, len);
}
//3关闭
reader.close();
writer.close();
System.out.println("复制完成");
}