IO流
1.IO之间的关系:
输入流:允许java程序获取外部设备的数据(磁盘,光盘,网络等)。
输出流:保留java程序中的数据,输出到外部设备上(磁盘,光盘等)
编码:字符—–编码字符集——–》二进制
解码:二进制—解码字符集———》字符
File类:IO只能够操作数据,但是不能够对文件的信息做操作,操作文件必须使用File类。
File类的作用:
- 可以将文件或者文件夹在程序当中分装成对象。
- 方便对于文件或者文件夹当中的属性信息进行操作。
- File类通常通过构造函数作为参数传递到流的对象当中。
2.流的分类:
通过不同的方法,可以对于进行分类。
1.按照功能来划分:
输入流:只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能从中读取数据。
2.按照处理单元来划分
字节流和字符流操作的方式基本上完全相同。操作的数据单元不同
字节流:操作的是8位的字节 InputStream/OutputStream 作为字节流的基类
字符流:操作的是16位的字符 Reader/Writer 作为字符流的基类
3.按照角色进行划分
节点流:可以直接从/向外部设备读取/写入数据的流,称之为节点流,节点流也被称之为低级流。
处理流:对于已经存在的流进行了连接和封装,扩展了原来的读/写的功能。处理流也被称之为高级流。
java的io包当中包括40多个流,他们都有紧密的联系,和使用的规律,这些流都源于4个抽象基类。
InputStream / Reader :所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer :所有输出流的基本,前者是字节输出流,后者是字符输出流。
3.流的操作步骤
1.读入文件
- 创建流对象
- 创建一个缓存字节的容器数组
- 定义一个变量,保存实际读取的字节数
- 循环读取数据
- 关闭流
//1. 创建流对象
FileInputStream fis=null;
File file=new File("txtTest.text");
try{
fis=new FileInputStream(file);
//2.创建一个缓存字节的容器数组
byte[] buf=new byte[1024];
//3.定义一个变量,保存实际读取的字节数
int len;
//4.循环读取数据
while((len=fis.read(buf))!=-1){
String str=new String(buf,0,len);
System.out.println(str);
}
}
catch(Exception e){
e.printStackTrace();
}
finally {
// 5.关闭流
if (fis!=null) {
try {
fis.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
2.读出文件
- 创建流对象
- 准备数据源,把数据源转换成字节数组类型
- 通过流向文件当中写入数据
- 刷新流
- 关闭流
//1.创建流对象
FileOutputStream fos=null;
try{
fos=new FileOutputStream(new File("txtTest.text"));
//2.准备数据源,把数据源转换成字节数组类型
String msg = "春夜喜雨\n好雨知时节,当春乃发生。\n随风潜入夜,润物细无声。";
byte[]buffer=msg.getBytes();
//3.通过流向文件当中写入数据
fos.write(buffer,0,buffer.length);
//4.刷新流
fos.flush();
}catch (Exception e){
}
finally {
if(fos!=null) {
try {
//5.关闭流
fos.close();
}catch (Exception e){
e.printStackTrace();
}
}
3.处理流
处理流的好处:处理流必须在节点流的基础之上,增加了效率,提高了性能,扩大的功能。
1.缓冲流
缓冲字节流
BufferedInputStream
BufferedOutputStream
缓冲字符流
BufferedReader
BufferedWriter
处理流内部包含了节点流,节点流决定了与其沟通的外部设备,而处理流则增加了其功能。
缓冲流的好处:
没有缓存区,那么每read一次,就会发送一次IO操作;有缓存区,第一次read时,会一下读取x个字节放入缓存区,然后后续的read都会从缓存中读取,当read到缓存区末尾时,会再次读取x个字节放入缓存区。
缓冲流内部包含一个缓冲区域,默认8kb,每一次程序调用read方法其实都是从缓冲区域当中读取内容,如果读取失败就说明缓冲区域当中没有内容,那么就从数据源当中读取内容,然后会尽可能读取更多的字节放入到缓冲区域当中,最后缓冲区域当中的内容,会全部返回给程序。
从缓冲区读取数据会比直接从数据源读取数据的速度快,效率也更高,性能更好。
2.转换流:
转换流作用:把字节流转换成字符流,可以解决出现的因为编码集和解码集造成的乱码问题。
InputStreamReader:
OutputStreamWriter:
在处理文件时,如果文件的字符格式和编译器处理格式不一样时,会出现乱码问题。比如文件字符格式GBK,
InputStreamReader :转换输入流–》将字节输入流转换成字符输入流
作用:为了防止文件使用字符输入流处理时出现乱码问题。
3.字节数组流(内存流也称为管道流)
ByteArrayInputStream
ByteArrayOutputStream
作用:可以在循环当中把所有的数据存放到统一的容器当中,然后在循环结束之后可以把容器当中所有的内容一起取出来。
注意事项:
内存流属于内存当中的资源,所以数据量不要过大,如果太大,会造成内存溢出的错误。
笔记内容根据b站 狂神说java教学视频学习后整理所得