文章目录和我一起学习Java吧,加油!
- 前言
- 一、File
- 二、IO流
- 1.Inputstream
- 代码
- 2.OutputStream
- 代码
- 3.CopyFile
- 代码
- 异常抛出
- 异常捕获
- 封装CopyFile类
- 总结
前言
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
一、File
File 文件路径的抽象表现形式
注意 : java中字符串中定义路径 的分隔符可以为 / // \ 不能使用,会识别为转义字符
常用功能可查询
二、IO流需求 : 读写文件内部的内容,File类无法实现,没有提供这样功能,所以可以通过IO实现
IO流 :
流 : 指一连串流动的数据,以先入先出的方式发送数据,流就是管道
数据源 ---> 数据 ---> 目的地
流的分类 :
按照流向分 : (以程序(人大脑)为中心)
输入流
输出流
操作单元分 :
字节流 : 万能流
字符流 : 只能传输纯文本文件
按照功能分 :
节点流 : 从数据源到目的地直接传输,真实做读入写出能力
功能流(包装流) : 从数据源经过包装再到目的地--> 增强节点流的功能,提高节点流的性能
注意 : 不同层面的流存在不同的划分,但是不冲突,都是相辅相成的
java.io 包下提供使用io相关的类型
1.Inputstream
InputStream : 此抽象类是表示输入字节流的所有类的超类。
操作不同的数据源,字节输入流提供了不同的子类
文件流
FileInputStream 文件字节输入流
字节数组(了解)
ByteArrayInputStream 字节输入数组流
文件字节输入流使用步骤 :
1.与文件建立联系(表示文件)
2.构建输入流
3.读入数据
4.处理数据
5.关闭
代码
// 1.与文件建立联系(表示文件)
// 2.构建输入流
InputStream is = new FileInputStream("D://test.txt");
// 3.读入数据
//int read() 从此输入流中读取一个字节的数据。
int num = -1;
while((num=is.read())!=-1){
// 4.处理数据
System.out.println((char)num);
}
// 5.关闭
is.close();
优化
//1.构建流
InputStream is = new FileInputStream("D://test.txt");
//2.读取
int len = -1;
byte[] car = new byte[1024];
while((len = is.read(car))!=-1){
//3.处理
System.out.println(new String(car,0,len));
}
//4.关闭
is.close();
再优化
//构建流
InputStream is = new FileInputStream("D://test.txt");
//byte[] readAllBytes() 从输入流中读取所有剩余字节。
byte[] datas = is.readAllBytes();
System.out.println(new String(datas));
//4.关闭
is.close();
2.OutputStream
字节输出流 OutputStream : 此抽象类是表示输出字节流的所有类的超类。
节点流 输出流 节点流
根据目的地选择使用哪一种具体的字节输出流的子类
文件字节输出流 FileOutputStream
字节数组输出流(了解) ByteArrayOutputStream
文件字节输出流使用步骤 : 1.构建File对象目的地 2.构建输出流 3.准备数据 4.写出 5.刷出 6.关闭
注意 :
在使用输出流的时候,如果目的地文件不存在,系统会自动创建目的地文件,但是如果目的地文件所在路径不存在,不会创建,会抛出异常java.io.FileNotFoundException
向文件中写出内容时候,会默认覆盖原文件内容,如果想要实现追加,在构建流的构造器中可以添加一个参数boolean append->true追加,默认false不追加覆盖
代码
//1.构建File对象目的地
//2.构建输出流
//OutputStream os = new FileOutputStream(dest);
OutputStream os = new FileOutputStream("D://hehe.txt",true);
//3.准备数据
int num = 97;
byte[] arr = "你好".getBytes();
//4.写出
//void write(byte[] b) 将指定字节数组中的 b.length字节写入此文件输出流。
//void write(byte[] b, int off, int len) 将从偏移量 off开始的指定字节数组中的 len字节写入此文件输出流。
//void write(int b) 将指定的字节写入此文件输出流。
os.write(num);
os.write(arr);
//5.刷出
os.flush();
//6.关闭
os.close();
3.CopyFile
拷贝文件 : *****
数据源文件—> 输入流—> 程序 —>输出流—> 目的地文件
步骤 :
1.构建流
输入流
输出流
2.读写数据
3.刷出
4.关闭(后打开的先关闭)
代码
异常抛出
// 1.构建流
InputStream is = new FileInputStream("D://test.txt");
OutputStream os = new FileOutputStream("D://AAA/test.txt",true);
// 2.读写数据
int len = -1; //记录每次读入到字节数组中数据的个数
byte[] car = new byte[1024];
while((len = is.read(car))!=-1){
os.write(car,0,len); //写出字节数组中读入的数据
}
// 3.刷出
os.flush();
// 4.关闭(后打开的先关闭)
os.close();
is.close();
异常捕获
// 1.构建流
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream("D://test.txt");
os = new FileOutputStream("D://AAA/haha.txt",true);
// 2.读写数据
int len = -1; //记录每次读入到字节数组中数据的个数
byte[] car = new byte[1024];
while((len = is.read(car))!=-1){
os.write(car,0,len); //写出字节数组中读入的数据
}
// 3.刷出
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4.关闭(后打开的先关闭)
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
封装CopyFile类
public static void copyFile(String src, String dest) throws FileNotFoundException {
copyFile(src!=null?new File(src):null,dest!=null?new File(dest):null);
}
public static void copyFile(File src, File dest) throws FileNotFoundException {
//判断是否存在src,dest对象
if(src==null || dest==null){
throw new NullPointerException("数据源或目的地为null!!!");
}
//判断数据源文件在系统中是否真实存在,存在才能拷贝,不存在不能拷贝
if(!src.exists()){
throw new FileNotFoundException("数据源在系统中不存在...");
}
}
总结
欢迎留言!!



