【IO编程】4.节点流和处理流
时间:2021-07-21
本文章向大家介绍【IO编程】4.节点流和处理流,主要包括【IO编程】4.节点流和处理流使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 基本介绍
- 节点流是从一个特定的数据源读写数据,如FileReader、FileInputStream
- 处理流也叫包装流,对已存在的流(节点流或处理流)进行包装,提供更强大的读写功能,如:BuffededReader、BufferedInputStream
2. 节点流和处理流的划分
3. 节点流和处理流的异同
- 节点流是底层流,直接跟数据源连接。
- 处理流使用了装饰器设计模式,对节点流进行包装。
- 处理流包装节点流,可以消除不同节点流的实现差异,提供统一的接口完成输入输出。
4. 处理流的优势
- 提高性能:增加了缓冲的方式提高输入输出的效率。
- 操作便捷:提供多个方法来一次输入输出大批量数据,使用灵活。
5. BufferedReader介绍
- 构造方法
- BufferedReader(Reader in, int sz)
- in: 节点流或处理流的字符输入流对象
- sz: 缓存大小
- BufferedReader(Reader in)
- 使用默认缓存大小8192
- BufferedReader(Reader in, int sz)
- 成员方法
- String readLine()
- 读取一行,忽略最后的"\n"
- void close()
- 调用处理流的close()方法时会调用字节流的close()方法
- String readLine()
使用BufferedReader读取文本文件,代码如下:
@Test
public void readFile() {
BufferedReader br = null;
String line;
try {
br = new BufferedReader(new FileReader("e:\\test.txt"));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6. BufferedWriter介绍
-
构造方法
- BufferedWriter(Writer out, int sz)
- out: 节点流或处理流字符输出流对象
- sz: 缓存大小
- BufferedWriter(Writer out)
- 使用默认缓存大小8192
- BufferedWriter(Writer out, int sz)
-
成员方法
- void write(String str)
- void write(String str, int off, int len)
- 将字符串写入文件
- void newLine()
- 插入一个和系统相关的换行符
- void close()
- 调用处理流的close()方法时会调用字节流的close()方法
@Test
public void writeFile() {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("e:\\test.txt"));
bw.write("hello, world");
bw.newLine();
bw.write("hello, java");
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
7. 使用BufferedReader和BufferedWriter实现文本文件拷贝
此方法只适用于文本文件拷贝,用于二进制文件拷贝会损坏文件。代码如下:
public boolean copyFile(String sourceFilePath, String destFilePath) {
boolean success = false;
BufferedReader br = null;
BufferedWriter bw = null;
String line;
try {
br = new BufferedReader(new FileReader(sourceFilePath));
bw = new BufferedWriter(new FileWriter(destFilePath));
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return success;
}
8. BufferedInputStream介绍
- 构造方法
- BufferedInputStream(InputStream in, int size)
- in: 节点流或处理流的字节输入流对象
- size: 缓存大小
- BufferedInputStream(InputStream in)
- 使用默认缓存大小8192
- BufferedInputStream(InputStream in, int size)
- 成员方法
- int read(byte[] buf)
- 批量读取字节到数组中,返回读取到的字节数,如果到文件末尾返回-1
- int read()
- 读取一个字节
- void close()
- 调用处理流的close()方法时会调用字节流的close()方法
- int read(byte[] buf)
9. BufferedOutputStream介绍
- 构造方法
- BufferedOutputStream(OutputStream out, int size)
- out: 节点流或处理流的字节输出流对象
- size: 缓存大小
- BufferedOutputStream(OutputStream out)
- 使用默认缓存大小8192
- BufferedOutputStream(OutputStream out, int size)
- 成员方法
- void write(int b)
- 写入一个字节
- void write(byte[] b, int off, int len)
- 写入指定数组的指定部分,以索引off开始,长度为len
- void close()
- 调用处理流的close()方法时会调用字节流的close()方法
- void write(int b)
10. 使用BufferedInputStream和BufferedOutputStream实现文件拷贝
实现思路与BufferedReader和BufferedWriter基本一致,代码如下:
public boolean copyFile(String sourceFilePath, String destFilePath) {
boolean success = false;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
byte[] buffer = new byte[8192];
int readLength = 0;
try {
bis = new BufferedInputStream(new FileInputStream(sourceFilePath));
bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
while ((readLength = bis.read(buffer)) != -1) {
bos.write(buffer, 0, readLength);
}
success = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return success;
}
原文地址:https://www.cnblogs.com/haojinglei/p/15039254.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「Android」通过注解自动生成类文件:APT实战(AbstractProcessor)
- 五、开始Github和码云之旅,新手如何上路
- 用 Shader 写个完美的波浪~
- K8s上的Go服务怎么扩容、发版更新、回滚、平滑重启?教你用Deployment全搞定!
- 图解Go内存管理器的内存分配策略
- why哥这里有一道Dubbo高频面试题,请查收。
- 「容器平台」Kubernetes网络策略101
- 架构师之路 - 服务器硬件扫盲
- 零基础Python教程045期 元组的增删改查测试实验
- 零基础Python教程044期 列表的函数方法,很耐用!
- 零基础Python教程047期 GUI窗体界面编程,迈出软件开发的第一步
- 零基础Python教程046期 矩阵行列互换算法,二维数组的典型应用
- 有一次小明传数据给我,把我弄哭了
- Java删除空字符:Java8 & Java11
- 6k+点赞的SpringBoot+Netty分布式即时通讯系统!爱了爱了!