IO流也称为输入输出流,用于读写数据的。
IO流概述
- I:即input,是将数据从硬盘读入到内存的过程,称为输入,负责读。
- O:即Output,是将数据从内存写入硬盘的过程,称为输出,负责写。
IO流分类
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
按数据流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流
下图是io流的分类图
字节输入流
构造器 | 说明 |
public FileInputStream(File file) | 创建字节输入流对象与源文件对象接通 |
public FileInputStream(String pathname) | 创建字节输入流对象与源文件路径接通 |
字节输入流FileInputStream主要方法:
返回值 | 方法名 | 详情 |
int | read() | 从此输入流中读取一个数据字节。如果字节没有可读的返回-1. |
int | read(byte[] b) | 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果字节没有可读的返回-1. |
int | read(byte[] b, int off, int len) | 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 |
void | close() | 关闭此输入流并释放与该流关联的所有系统资源。 |
下面代码能更直观的知道如何使用输入流
package com.lyc.lesson;
import java.io.*;
public class Lesson01 {
public static void main(String[] args) throws IOException {
//1、获取文件
File file = new File("C:/Users/ASUS/Desktop/zz2212/aaa/3.txt");
//2、将文件转化为文件流
InputStream fis = new FileInputStream(file);
//3、创建缓冲
BufferedInputStream bis = new BufferedInputStream(fis);
//4、创建缓冲区数组
//new byte[2] 每次读取两个字节
byte[] bytes = new byte[2];
//5、将缓冲区的字节存入到数组中
int read = bis.read(bytes);
//6、输出数组中的数据
// System.out.println(new String(bytes,0,read));
int length = -1;
while ((length = bis.read(bytes)) != -1){
System.out.println("-------------");
System.out.println(new String(bytes,0,length));
}
//7、关闭流
bis.close();
fis.close();
}
}
字节输出流
构造器 | 说明 |
public FileOutputStream(File file) | 创建一个字节输出流管道通向目标文件对象 |
public FileOutputStream(String filePathname) | 创建一个字节输出流管道通向目标文件路径 |
public FileOutputStream(File file,boolean append) | 创建一个追加数据的字节输出流管道通向目标文件对象 |
public FileOutputStream(String file,boolean append) | 创建一个追加数据的字节输出流管道通向目标文件路径 |
字节输出流FileOutputStream
主要方法:
返回值 | 方法名 | 详情 |
void | write(byte[] b) | 将 b.length 个字节从指定 byte 数组写入此文件输出流中。 |
void | write(byte[] b, int off, int len) | 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 |
void | write(int b) | 将指定字节写入此文件输出流。 |
void | close() | 关闭此输入流并释放与该流关联的所有系统资源。 |
输出流的使用如下
package com.lyc.lesson;
import java.io.*;
public class Lesson04 {
public static void main(String[] args) throws IOException {
//获取文件位置
File file = new File("C:/Users/ASUS/Desktop/zz2212/aaa/1.txt");
//
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//将字符串转化为字节数组
String str = "我是帅哥,我好帅";
byte[] bytes1 = str.getBytes();
//write(),将字符数组写入缓冲数组中
bos.write(bytes1,0, bytes1.length);
//刷新
bos.flush();
//关闭流,先创建的流,后关闭;后创建的流,先关闭
bos.close();
fos.close();
}
}
字符输出流,字符输入流和以上的字节流使用方法很相似,在开发中一般使用字节流。
文件拷贝
文件拷贝案例:
需求:把某文件的内容复制到其他目录下
思路:
1、根据数据源创建字节输入流对象
2、根据目标地创建字节输出流对象
3、读写数据,复制内容
4、释放资源
案例解决代码:
package com.zcl.d4_byte_OutputStream;
import java.io.*;
/*
目标:学会字节流拷贝文件(支持一切的字节流文件)
*/
public class CopyDemo {
public static void main(String[] args) {
try {
// 1、创建一个字节输入流管道与文件接通
InputStream is = new FileInputStream("D:\\黑马2022java学习路线);
// 2、创建一个输出管道与目标文件接通
OutputStream os = new FileOutputStream("D:\\abc.mp4");
// 3、定义一个字节数组转移数据
byte[] buffer = new byte[1024];
int len; // 记录转义的字节数
while ((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
System.out.println("数据读取完成");
// 完成一定要关闭流
os.close();
is.close();
} catch (Exception e) {
// 拦截预测
e.printStackTrace();
}
}
}
资源释放
资源释放的方式:try-catch-finally
注意:不管代码是否正常或者异常亦或者rteurn都会执行finally中的代码,开发中不建议在finally中加入return返回数据,很容易出现问题
finally:在异常处理时提供finally块来执行所有清除操作,比如说IO流中释放资源
特点:被finally控制的语句最终一定会执行,除非JVM退出
格式代码:
package com.zcl.d5_resource;
import java.io.*;
/*
目标:学会使用finally释放资源
*/
public class TryCatchfinnal {
public static void main(String[] args) {
InputStream is = null;
OutputStream os = null;
try {
// 1、创建一个字节输入流管道与文件接通
is = new FileInputStream("D:\\黑马2022java学习路线\\第1阶段—Java SE基础\\1、Java基础--20天学会Java\\20天学会java—视频\\day14-常用API(常用API、正则表达式、Lambda、算法)\\day14-常用API(常用API、正则表达式、Lambda、算法)\\01、今日课程介绍.mp4");
// 2、创建一个输出管道与目标文件接通
os = new FileOutputStream("D:\\abc.mp4");
// 3、定义一个字节数组转移数据
byte[] buffer = new byte[1024];
int len; // 记录转义的字节数
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
System.out.println("数据读取完成");
} catch (Exception e) {
// 拦截预测
e.printStackTrace();
} finally {
// 无论代码释放正常结束还是异常结束都会执行
// 完成一定要关闭流
try {
// 一定要做非空校验
if (os != null) os.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (is != null) is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}