【IO流】:Input Output
连接文件和应用程序的管道
【按照流向来说:参照物是应用程序:】
1. 输入流: input 从硬盘(存储设备)到内存
2. 输出流: output 从内存到硬盘(存储设备)
【 按照处理的单位:】
字节流:
就是按照文件的二进制编码,一个字节为一个操作单位来进行读写操作
字符流:
也是按照字节操作的,但是多了一个翻译的功能
0011 0001 0010 0111
我 们 最 强
字符流 = 字节流 + 解码
操作的单位是一个字符!
【【字节流:】】
输入字节流:从硬盘到内存
----| InputStream 这是所有输入字节流的基类 抽象类
--------| FileInputStream 读取文件的输入字节流
读取文件操作步骤:
1. 找到文件:
File 类对象
String 文件路径
2. 创建FileInputStream 输入管道
3. 读取文件
4. 关闭管道(资源)
【代码片实例】
//1.找到文件
File file=new File("D:\\bbb\\1.txt");
//2.判断文件是否存在
if(!file.exists()){
throw new FileNotFoundException("文件是否存在");
}
//3.建立输入管道
FileInputStream input=new FileInputStream(file);
//4.创建byte缓冲数组
byte[] buffer=new byte[1024];
int count=-1;
//5.利用循环读取文件
while((count=input.read(buffer))!=-1){
// String(byte[] bytes, int offset, int length)
// 通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
System.out.print(new String(buffer,0,count));
}
//6.关闭资源
input.close();
*****************************************************
---- |OutputStream 输出字节流的基类
----------|FileOutputStream 文件的输出字节流
写入文件的流程:
1. 找到要操作的文件
2. 创建输出通道
3. 写入数据
4. 关闭资源
FileOutputStream 注意事项;
1. 如果是规规矩矩创建的FileOutputStream的输出管道,在写入数据的时候,首先会清空文件(不管原来有没有数据),在来写入数据(原来的数据也会回来的)
2. 在写入文件的时候,如果操作文件不存在,创建文件,写入
3. FileOutputStream如果在创建的时候,添加的true,表示是追加写入
4. 用FileOutputStream中的write方法,写入数据的时候,如果写入的是一个int类型数据
只写入该int类型的低8位
0100 0000 0000 0000 0000 0000 0111 1100 =》1073741948
真正写入数据为:
0111 1100 该int的低八位
【代码片实例】
//1.找到文件
File file=new File("D:\\bbb\\1.txt");
//2.建立输出管道
FileOutputStream output=new FileOutputStream(file,true);
//3.写入数据(追加)
output.write("\r\n有惊无险到了六点,上午下午不如周五".getBytes());
//4.关闭资源
output.close();
*****************************************************
【【字节流实现文件的拷贝】】
//1.找到源文件
File srcFile=new File("D:\\Study\\ascii.jpg");
//2.目标文件
File destFile=new File("D:\\bbb\\temp.jpg");
//3.建立文件的输入通道
FileInputStream input=new FileInputStream(srcFile);
//4.建立文件的输出通道
FileOutputStream output=new FileOutputStream(destFile);
//5.读取文件,写入文件,这里写入的要求是追加的形式
int count=-1;
byte[] buffer=new byte[1024];
while((count=input.read(buffer))!=-1){
output.write(buffer);
}
//6.关闭资源,先开后关,后开先关
output.close();
input.close();
****************************************************************
【【字符流:】】
----| Reader 输入字节流的基类,抽象类
---------| FileReader 读取文件的输入字符流
FileReader 使用方式:
1. 找到文件
2. 建立reader读取通道
3. 读取数据
4. 关闭资源
【代码片的实例】
//1.找到文件
File file=new File("D:\\bbb\\1.txt");
if(!file.exists()){
throw new FileNotFoundException();
}
//2.建立Reader
FileReader reader=new FileReader(file);
//准备一个char类型的数组缓冲区
char[] buffer=new char[1024];
int count=0;
//3.读取文件
while((count=reader.read(buffer))!=-1){
//将字符数组转化为String类型的
System.out.println(new String(buffer,0,count));
}
//4.关闭资源
reader.close();
*******************************************************
输出字符流:
----| Writer 输出字符流的基类,抽象类
--------| FileWriter 向文件写入数据的字符流
FileWriter的使用流程:
1. 找到目标文件
2. 建立数据输出通道
3. 写入数据
4. 关闭资源
FileWriter的注意事项:
1. 使用FileWriter写入数据的生活,FileWriter内部是默认维护了一个1024个字符的数组,
如果要求写入的数据,会首先保存到这个数中,如果需要真正的写入到硬盘中, 可以使用三种方式,
第一种,调用flush方法
第二种,关闭资源
第三种,填满当前的1024字节的数组
2. 使用FileWriter的时候,如果目标文件不存在,会自动创建
3. 使用FileWriter写入数据的时候,如果文件存在,会首先清空文件,再来做写入操作,如果想要追加写
可以调用FileWriter(File file, boolean append); append传值为true标书追加写
************************************************************
------| InputStream 输入字节流基类
-----------| FileInputStream 文件操作的输入字节流
-----------| BufferedInputStream 缓冲输入字节流,在缓冲字节流对象中,底层维护了
一个大小为8KB的缓冲字节数组
BufferedInputStream里面构造函数需要一个InputStream的子类类对象,这个类对象是用来提供
读写能力
【注意】所有的缓冲流都是没有读写能力!!!
使用流程:
1. 找到目标文件
2. 建立管道
---- 首先创建当前文件的InputStream的子类类对象
---- 使用InputStream的子类类对象,创建缓冲字节输入流对象
3. 读取数据
4. 关闭缓冲字节流
5. 关闭资源InputStream
使用缓冲字节流,比自定义的缓冲数据要快一点点 8KB
原因 内存的读取效率远高于硬盘
*********************************************************************************
BufferedReader 底层维护的是一个元素个数为8192(即8k)的字符数组 -----缓冲流都是没有读写能力,
File file=new File("D:\\bbb\\1.txt");
if(!file.exists()){
throw new FileNotFoundException();
}
FileReader reader=new FileReader(file);
BufferedReader br=new BufferedReader(reader);
int count=-1;
char[] buffer=new char[1024];
while((count=br.read(buffer))!=-1){
System.out.println(new String(buffer,0,count));
}
br.close();
*********************************************************************************************
File file = new File("D:\\bbb\\1.txt");
FileWriter writer = new FileWriter(file);
BufferedWriter br = new BufferedWriter(writer);
br.write("fsgsegwregsdgsdgs");
// 数据不会立即写入,是保存在BufferedWriter的缓冲字符数组中,除非资源关闭,数组填满或者调用了
// flush 才会真正的把数据写入到硬盘当中,这样的方式,是为了保护硬盘,提高效率
br.close();