Java之节点流和处理流(Buffered字节字符处理流)
文章目录
- 前言
- 基本介绍
- Buffered字符处理流
- BufferedReader缓冲字符输入流
- BufferedWriter缓冲字符输出流
- 文件拷贝
- Buffered字节处理流
- 文件拷贝(二进制文件)
- 处理流关闭问题
前言
Java中的流按照功能可以分为节点流和处理流。其中节点流是直接用来访问数据源,而数据源又分为文件、内存、管道(线程间通信使用),所以就需要不同的类来进行处理。每次从数据源中读取的数据单位又可以分为字节和字符。
基本介绍
节点流:可以从一个特定的数据源读写数据,如FileReader、FileWriter等(程序用于直接操作目标设备所对应的类)
处理流:是“连接”已存在的流(节点流和处理流)之上,为程序提供强大的读写功能,更加灵活。 程序通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流(也叫包装流,对节点流进行包装)如BufferedReader 、BufferedWriter等
处理流中可以封装一个节点流,该节点流可以是任意的,只要是处理流父类的子类!
节点流和处理流流览图
区别:
- 节点流是底层流/低级流,直接跟数据源相接
- 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出
- 处理流对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连
处理流设计模式模拟
public abstract class Reader_ {//抽象类public void readFile() {}public void readString() {}
}class FileReader_ extends Reader_ {public void readFile() {System.out.println("对文件进行读取...");}
}class StringReader_ extends Reader_ {//节点流lpublic void readString() {System.out.println("读取字符串...");}
}/*** 做成处理流,也叫包装流*/
class BufferedReader_ extends Reader_ {private Reader_ reader_;//属性就是Reader_类型public BufferedReader_(Reader_ reader_) {this.reader_ = reader_;}//让方法更加灵活,多次读取文件 扩展public void readFiles(int num) {for (int i = 0; i < num; i++) {reader_.readFile();}}//扩展readString,批量处理字符串数据public void readStrings(int num) {for (int i = 0; i < num; i++) {reader_.readString();}}@Overridepublic void readFile() {reader_.readFile();}@Overridepublic void readString() {reader_.readString();}
}class Test_ {public static void main(String[] args) {//使用节点流BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());bufferedReader_.readFile();bufferedReader_.readFiles(10);BufferedReader_ bufferedReader_1 = new BufferedReader_(new StringReader_());bufferedReader_1.readStrings(10);}
}
处理流的功能:
- 性能的提高:主要以增加缓冲的方式来提高输入输出的效率
- 操作的便捷:操作更加灵活方便
Buffered字符处理流
常见的两个字符处理流(属于字符流,按照字符来读取数据的)
BufferedReader:从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行
可以通过构造函数指定缓冲区大小也可以使用默认大小。
BufferedWriter:将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串。
因为有缓冲区所以很效率比没有缓冲区的很高,在关闭处理流时,是需要关闭外层流即可(底层会自动关闭节点流的)
BufferedReader缓冲字符输入流
BufferedReader类下有一个Reader属性,它用于存放Reader类下的流,包装操作
BufferedReader提供了两个构造器,根据不同的场景进行选择
- BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流
- BufferedReader(Reader in, int sz) 创建一个使用指定大小的输入缓冲区的缓冲字符输入流。
示例
使用BufferedReader读取文本文件,并显示在控制台,readLine按行读取文件(BufferedReader类下的方法),当返回null时,表示读取完毕。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class BufferedReader_ {public static void main(String[] args) throws IOException {//throws对异常进行处理的方式String filePath = "E:\\Utility.java";//创建BufferedReader对象BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));//BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));追加模式//读取String line;//按行读取,效率高while ((line = bufferedReader.readLine())!=null){System.out.println(line);}bufferedReader.close();}
}
此时控制台输出E盘下的Utility.java的内容
BufferedWriter缓冲字符输出流
BufferedWriter类中的Writer属性与BufferedReader中的Reader属性同理!
BufferedWriter提供了两个构造器,根据不同的场景进行选择
- BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流
- BufferedWriter(Writer out, int sz) 创建一个新的缓冲字符输出流,该流使用给定大小的输出缓冲区
通过BufferedWriter写入文件字符串,此代码演示使用的是writer(String str),writer可以写入多种数据,具体方法可进行百度或者查看JDK文档
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class BufferedWRITER_ {public static void main(String[] args) throws IOException {//throws对异常进行处理String filePath = "E:\\hello.txt";//创建一个BufferedWriterBufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));bufferedWriter.write("hello1");bufferedWriter.newLine();//插入一个换行bufferedWriter.write("hello2");bufferedWriter.newLine();//插入一个换行bufferedWriter.write("hello3");bufferedWriter.close();}
}
此时E盘下的hello.txt文本内容为:
hello1
hello2
hello3
切换FileWriter的构造器,可以将覆盖模式改为追加模式
文件拷贝
将D盘下的hello.txt文本拷贝到E盘下
import java.io.*;public class bufferedCopy_ {public static void main(String[] args) throws IOException {String srcFilePath = "D:\\hello.txt";//源String destFilePath = "E:\\hello.txt";//要拷贝的目录BufferedReader bufferedReader1 = new BufferedReader(new FileReader(srcFilePath));BufferedWriter bufferedReader2 = new BufferedWriter(new FileWriter(destFilePath));String temp;while ((temp = bufferedReader1.readLine())!=null){bufferedReader2.write(temp);bufferedReader2.newLine();//换行}bufferedReader1.close();bufferedReader2.close();System.out.println("拷贝成功");}
}
注意:如果拷贝的是二进制文件,则会乱码损毁(BufferedReader和BufferedWriter不要去操作二进制文件)
Buffered字节处理流
按照字节进行处理,常见的两个字节处理流(属于字节流,读取二进制数据)
- BufferedInputStream缓冲字节输入流
- BufferedOutputStream缓冲字节输出流
由此流览图可知字节处理流可字符处理流类似,构造器中是各自父类或子类的实现对象!
文件拷贝(二进制文件)
将D盘下的mbg图片拷贝到E盘下
演示使用BufferedInputStream和BufferedOutputStream拷贝二进制文件
import java.io.*;public class bufferedCopy {public static void main(String[] args) {String srcPath = "D:\\mbg.png";//要拷贝的文件String destPath = "E:\\mbg.png";//要拷贝到哪里BufferedInputStream bufferedInputStream1 = null;BufferedOutputStream bufferedOutputStream2 = null;try {bufferedInputStream1 = new BufferedInputStream(new FileInputStream(srcPath));bufferedOutputStream2 = new BufferedOutputStream(new FileOutputStream(destPath));byte[] bytes = new byte[1024];int readLen = 0;while ((readLen = bufferedInputStream1.read(bytes))!=-1){bufferedOutputStream2.write(bytes,0,readLen);}System.out.println("拷贝成功");} catch (IOException e) {e.getMessage();//输出异常} finally {try {bufferedInputStream1.close();//关闭流,释放资源bufferedOutputStream2.close();} catch (IOException e) {e.printStackTrace();}}}
}
处理流关闭问题
在关闭处理流时,是需要关闭外层流即可(底层会自动关闭节点流的)
当我们在 bufferedReader.close() 处下断点时
一路真正代码执行,发现底层会自动调用close方法对节点流进行关闭
Java之节点流和处理流(Buffered字节字符处理流)相关推荐
- Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】
视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java ...
- 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties
文章目录 1.lambda表达式标准语法:()->{} 2.lambda表达式简略语法:可推导即可省略 3.lambda表达式原理:lambda效率比匿名内部类高 4.两个函数式接口:Consu ...
- 2018-08-22字节字符转换流InputStreamReader+OutputStreamWriter+缓冲流Buffered+newLine换行方法...
OutputStreamWriter类: 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表(一般是GBK和U ...
- java字符串转字节流_java 字节→字符转换流
OutputStreamWriter:把字节输出流对象转成字符输出流对象 InputStreamReader:把字节输入流对象转成字符输入流对象 FileWriter和FileReader分别是Out ...
- 字节流转化为文件流_JAVA IO分析一:File类、字节流、字符流、字节字符转换流...
因为工作事宜,又有一段时间没有写博客了,趁着今天不是很忙开始IO之路:IO往往是我们忽略但是却又非常重要的部分,在这个讲究人机交互体验的年代,IO问题渐渐成了核心问题. 一.File类 在讲解File ...
- Java19-day10【标准输入输出流、字节字符打印流、对象序列化-反序列化流、serialVersionUIDtransient、Properties】
视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...
- [Java基础]字节,字符打印流
代码如下: package PrintWriterPack;import java.io.FileNotFoundException; import java.io.PrintWriter;publi ...
- 2※、封装流(包装流派)、缓冲流【字节缓冲流、字符缓冲流】-->【字节缓冲流、字符缓冲流】 、字符集、转换流以及打印流
封装流(包装流) ※缓冲流 [字节缓冲流.字符缓冲流] 缓冲流[字节流]文件复制以及BufferedOutputStream的源码查看 缓冲流[字符流] [读取操作.写出操作] 练习:文本排序:请将文 ...
- Java IO 节点流与处理流类型
处理流类型: 1.处理流之首先缓冲流: 解释: 例子:TestBufferStream1.java package com.zhj.www;import java.io.BufferedInputSt ...
最新文章
- 我对图像金字塔的理解及OpenCV下的实现代码
- dbeaver导出表结构和数据_Oracle 导入导出表空间跟数据表通用操作笔记
- UDP(首部)和TCP(首部、三次握手、四次挥手、可靠传输、滑动窗口、流量控制、拥塞控制(慢开始、拥塞避免、快重传、快恢复))
- java 图片压缩 base64_图片改变像素,宽高,Base64编码处理
- Coriant助力Aureon部署100Gbps光纤网络
- linux系统中使用pycharn,在pycharm中使用linux控制台
- java定义基础变量语句_编程语言第一:JAVA语言基础,变量
- Android多线程优劣,Android 开发中用到的几个多线程解析
- JimuReport积木报表,一个好用的开源免费的报表平台!
- dnf新起号怎么才不出人脸_DNF玩家花8千买号,还不到1年,眼前的一幕让他目瞪口呆...
- android 自定义控件 焦点,Android 自定义Button按钮显示样式(正常、按下、获取焦点)...
- 河北大学工商学院计算机分数线,河北大学工商学院录取分数线()
- 对话MySQL之父:代码一次性完成才是优秀程序员
- Android对现有的apk进行修改(汉化,修改QQ尾巴)
- 对于大学工作规划和面试前准备
- java实训———百词斩
- 【经验总结】如何做好复盘
- outlook发送邮件被服务器拒绝,Outlook不能发邮件是什么原因?
- Python 与数据库交互的封装(MySQL,SQLServer,SQLite)
- 三菱FX1N两轴标准程序,程序包括有轴点动,回零,相对定位, 绝对定位,程序结构清晰明了,注释完整