- I/O流
- 1、定义
- 2、分类
- 2.1 字节流和字符流
- 2.2 输入流和输出流
- 2.3 节点流和处理流
- 3、结构
- 4、字节流
- 4.1 定义
- 4.2 说明
- 4.3 字节流概述
- 4.4 InputStream的常用方法
- 4.5 OutputStream的常用方法
- 5、字节流读写文件
- 5.1 说明
- 5.2 注意
- 5.3 字节输入流——相关代码
- 5.4 字节输出流——相关代码
- 6、文件的拷贝
- 6.1 需求
- 6.2 分析
- 6.3 注意
- 6.4 快捷键
- 6.5 相关代码
- 7、字节流的缓冲区
- 7. 相关代码
- 8、字节缓冲流
- 8.1 说明
- 8.2 特点
- 8.3 相关代码
- 8.4 过程
I/O流(Input/Output)流,即输入/输出流,是java中实现输入/输出的基础,他可以方便实现数据的输入/输出操作。(数据的传输)
2、分类 2.1 字节流和字符流根据流操作的数据单位的不同,可以分为字节流和字符流
2.2 输入流和输出流根据流传输方向的不同,又可以分为输入流和输出流
2.3 节点流和处理流根据流的功能不同,可以分为节点流和处理流
3、结构java中的I/O流主要定义在java.io包中,该包下定义了很多类,其中有四个类为流的顶级类,分为InputStream和OutputStream, Reader和Writer
(1)InputStream和OutPutStream是字节流,而Reader和Writer是字符流
(2)InputStream和Reader是输入流,而OutPutStream和Writer是输出流
(3)这四个顶级类都是抽象类,并且是所有流类型的父亲。
在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流。
4.2 说明字节流是程序中最常用的流
在JDK中,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OutputStream。
InputStream被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。
4.4 InputStream的常用方法方法声明 功能描述
int read() 从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数。当没有可用字节时,将返回-1
int read(byte[] b)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目
int read(byte[] b,int off,int len) 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目
void close() 关闭此输入流并释放与该流关联的所有系统资源
前三个read()方法都是用来读数据的,分按字节读取和按字节数组读取。
进行I/O流操作时,应该调用close()方法关闭流,从而释放当前I/O流所占的系统资源。
void write(int b) 向输出流写入一个字节
void write(byte[] b) 把参数b指定的字节数组的所有字节写道输出流
void write(byte[] b, int off, int len) 将指定byte数组中从偏移量off开始的len个字节写入输出流
void flush() 刷新此输出流并强制写出所有缓冲的输出字节
void close() 关闭此输出流并释放与此流相关的所有系统资源
前三个write()方法都是用来写数据的,分按字节读取和按字节数组写入。
flush()方法用来将当前输出流缓冲区(通常是字节数组)中的数据强制写入目标设备,此过程称为刷新
close()方法是用来关闭流并释放与当前IO流相关的系统资源。
(1)针对文件的读写操作,JDK专门提供了两个类,分别是FileInputStream和FileOutputStream
FileInputStream是InputStream的子集,它是操作文件的字节输入流,专门用于读取文件中的数据。
(2)从文件读取数据是重复的操作,因此需要通过循环语句来实现数据的持续读取
在读取文件数据时,必须保证文件在相应目录存在并且是可读的,否则会抛出FileNotFoundException
5.3 字节输入流——相关代码//假如在D盘已经有个a.txt文件,里面的内容是a,b,c
//read(): 一次读取一个字节,如果读取到了文件末尾,将会返回-1的标识
public class Demo1_FileStream{
public static void main(String[] args) throws FileNotFoundException{
//1.创建字节输入流对象
FileInputStream fis = new FileInputStream("D:\a.txt");
//2.读取文件中的数据
int i = fis.read();
System.out.println(i); //97
//2.读取文件中的数据
int i2 = fis.read();
System.out.println((char)i2); //b
}
}
//假如在D盘已经有个a.txt文件,里面的内容是a,b,c
//read(): 一次读取一个字节,如果读取到了文件末尾,将会返回-1的标识
public class Demo2_FileStream{
public static void main(String[] args) throws FileNotFoundException{
//1.创建字节输入流对象
FileInputStream fis = new FileInputStream("D:\a.txt");
//2.循环读取文件中的数据
int i;
//2.1 在循环中不断地调用read方法,并把读取到的数据给i赋值,只要没有读到-1,说明没有达到文件末尾
while((i = fis.read())!=-1){
System.out.println((char)i);
}
//3.关闭流释放资源
fis.close();
}
}
5.4 字节输出流——相关代码
public class Demo3_FileStream{
//字节输出流: FileOutputStream
//输出流写出数据,关联文件的时候,如果文件不存在,则自动创建
public static void main(String[] args) throws IOException{
//1.创建字节输出流对象
FileOutputStream fos = new FileOutputStream("D:\1.txt", true);
//2.写出数据
fos.write(98);
//或者
byte[] bytes = "你好,世界".getBytes();
System.out.println(Arrays.toString(bytes));
fos.write(bytes);
//等价于
fos.write("你好,世界2".getBytes());
//3.关闭流释放资源
fos.close();
}
6、文件的拷贝
6.1 需求
使用JavaIO技术完成文件的拷贝
6.2 分析(1)创建输入流和输出流对象
输入流对象关联要拷贝的数据源
输出流对象关联要拷贝的数据目的
(2)在读取过程中,将数据写出到目标文件当中
(3)关闭流释放资源
6.3 注意建议IO流的异常使用try…catch进行处理,并加入finally代码块将关闭流释放资源的代码,放在finally当中。
6.4 快捷键alt + shift + z --> try…catch
6.5 相关代码public class Test1_Copy{
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//1. 创建输入流和输出流对象
FileInputStream fis = new FileInputStream("D:\abc.txt");
FileOutputStream fos = new FileOutputStream("E:\copy.txt");
//2. 在读取的过程中,将数据写出到目标文件当中
int i;
while((i = fis.read())! = -1){
fos.write(i);
}
//3.关闭流释放资源
fis.close();
fos.close();
} catch (IOException e){
e.printStackTrace();
} finally{
//3.关闭流释放资源
if(fis!=null){
try{
fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
if(fos!=null){
try{
fos.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
7、字节流的缓冲区
在文件拷贝过程中,通过以字节形式逐个拷贝,效率很低,因此可以定义一个字节数组缓冲区,在拷贝文件时,就可以
一次性读取多个字节的数据。
//假如:已经在D盘创建了a,b两个文件
//read方法如果传入了数组,那么会根据数组容器大小,决定一次读取多少个字节
//read方法的返回值是: 读取到的(有效)字节个数
public class Test2_CopyFile{
public static void main(String[] args) throws IOException{
long start = System.currentTimeMillis();
//1. 创建输入输出流,关联数据源和数据目的
FileInputStream fis = new FileInputStream("D:\a.flv");
FileOutputStream fos = new FileOutputStream("D:\b.flv");
//创建字节缓冲区
byte[] bys = new byte[1024];
//2.在读取的过程中,将数据写出到数据目的
int len;
while((len = fis.read(bys))!=-1){
//3.写出的时候,从数组容器中取出,0-len(有效字节个数)
fos.write(bys,0,len);
}
fis.close();
fos.close();
long end = System.currentTimeMillis();
System.out.println("花费时间为:"+ (end-start) + "毫秒");
}
}
8、字节缓冲流
8.1 说明
除了定义字节缓冲区来提高文件拷贝效率外,IO中还提供了两个字节缓冲流来提高文件拷贝效率:
BufferedInputStream 和 BufferedOutputStream
他们的构造方法中分别接收InputStream和OutputStream类型的参数作为对象,在读写数据时提供缓冲功能。
由于两个流对象中,内置了字节(数组) ,从而提高IO流的读写效率。
8.3 相关代码public class Demo_BufferedStream{
public static void main(String[] args) throws IOException{
long start = System.currentTimeMillis();
//1.创建字节缓冲,输入输出流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\a.flv"));
BufferedOutputStream bos = new BufferedOutputStream(new FileInputStream("D:\b.flv"));
//2.读写操作
int i;
while((i=bis.read())!=-1){
bos.write(i);
}
//3.关闭流释放资源
bis.close();
bos.close();
long end = System.currentTimeMillis();
System.out.println("花费时间为:"+ (end-start) + "毫秒");
}
}
8.4 过程
数据源(源设备)——>FileInputStream(字节流)——>BufferedInputStream(字节缓冲流)——>JAVA(应用程序)——>BufferedOutputStream(字节缓冲流)——>FileOutputStream(字节流)——>数据目的(目标设备)



