JavaIO流03

4.常用的类02

4.4节点流和处理流

4.4.1基本介绍

  1. 节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter

    数据源就是存放数据的地方,比如文件、数组、字符串、管道等

  1. 处理流(也叫包装流)是“连接”在已经存在的流(节点流或者处理流)之上,为程序提供更为强大的读写功能,也更加灵活,如BufferedReader、BufferedWriter

  • 节点流和处理流的区别和联系:
  1. 节点流是底层流(低级流),直接和数据源相连接。
  2. 处理流(包装流)对节点流进行了包装,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  3. 处理流对节点流进行了包装,使用了修饰器的设计模式,不会直接与数据源相连接。

  • 处理流特点:

    1.性能的提高:主要以增加缓冲的方式来提高输入输出的效率。

    2.操作的便捷:处理流提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便。

4.4.2模拟包装流-修饰器模式

package li.io;

/**
* 模拟包装流的修饰器模式
*/
public abstract class Reader_ {//抽象类
public void readFile() {}
public void readString() {}
}
package li.io;

public class FileReader_ extends Reader_ {//模拟节点流

    public void readFile() {
System.out.println("对文件进行读取...");
}
}
package li.io;

public class StringReader_ extends Reader_ {//模拟节点流

    public void readString() {
System.out.println("读取字符串...");
}
}
package li.io;

/**
* 模拟处理流(包装流)
*/
public class BufferedReader_ extends Reader_ {
private Reader_ reader_;//属性是Reader_类型 public BufferedReader_(Reader_ reader_) {
this.reader_ = reader_;
} public void readFile(){//封装一层
reader_.readFile();
} //让方法更加灵活,比如多次读取文件,或者加缓冲byte[]...
public void readFile(int num) {
for (int i = 0; i < num; i++) {
reader_.readFile();
}
} //又如扩展readString方法,例如批量处理字符串数据...
public void readString(int num) {
for (int i = 0; i < num; i++) {
reader_.readString();
}
} }
package li.io;

public class Test_ {
public static void main(String[] args) { BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());
bufferedReader_.readFile(3);
bufferedReader_.readFile(); BufferedReader_ bufferedReader02_ = new BufferedReader_(new StringReader_());
bufferedReader02_.readString(2);
}
}

4.4.3字符处理流-BufferedReader&BufferedWriter

  • BufferedReader和BufferedWriter属于字符流,是按照字符来读取数据的

  • 在关闭流时,只需要关闭外层流(即包装流)即可

应用案例1:使用BufferedReader读取文本文件,并显示在控制台

BufferedReader构造方法:

BufferedReader常用方法:

public int read() throws IOException
//读取单个字符。
//作为一个整数(其范围从 0 到 65535 (0x00-0xffff))读入的字符,如果已到达流末尾,则返回 -1 public int read(char[] cbuf) throws IOException
//一次读取一个字节数组
//cbuf - 目标缓冲区
//读取的字符数,如果已到达流的末尾,则返回 -1 public void close() throws IOException
//关闭该流并释放与之关联的所有资源。 public String readLine() throws IOException
//读取一个文本行。通过下列字符之一即可认为某行已终止:换行 (’\n’)、回车 (’\r’) 或回车后直接跟着换行。
//包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 nu
package li.io.reader_;

import java.io.BufferedReader;
import java.io.FileReader; //演示BufferedReader的使用
public class BufferedReader_ {
public static void main(String[] args) throws Exception {
String filePath = "d:\\note.txt";
//创建
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath)); //读取
String line;
//readLine():按行读取文件,当返回null时,表示文件读取完毕
while((line = bufferedReader.readLine())!=null){
System.out.println(line);
} //关闭流:这里只需要关闭BufferedReader,底层会去自动地关闭节点流
bufferedReader.close();
}
}

思考:为什么只需要关闭外层流?

在代码bufferedReader.close();处打上断点,点击force step into,可以看到下图所示:

在底层调用的其实是:传进去的节点流对象的close()方法

这里的in就是我们传入的new FileReader(filePath)

应用案例2:使用BufferedWriter将“一只可爱的小猫咪”写入到文件中

BufferedWriter构造方法:

BufferedWriter常用方法:

void write(char ch);//写入单个字符。

void write(char []cbuf,int off,int len)//写入字符数据的某一部分。

void write(String s,int off,int len)//写入字符串的某一部分。

void newLine()//写入一个行分隔符。

void flush();//刷新该流中的缓冲。将缓冲数据写到目的文件中去。

void close();//关闭此流,再关闭前会先刷新他。
package li.io.writer_;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; //演示BufferedWriter的使用
public class BufferedWriter_ {
public static void main(String[] args) throws IOException {
String filePath = "d:\\ok.txt"; //创建BufferedWriter对象
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath)); //写入
bufferedWriter.write("一只可爱的小猫咪");
bufferedWriter.newLine();//插入一个和系统相关的换行
bufferedWriter.write("两只可爱的小猫咪");
bufferedWriter.newLine();
bufferedWriter.write("三只可爱的小猫咪");
bufferedWriter.newLine(); //关闭外层流即可,底层自动关闭穿入的内层流
bufferedWriter.close();
}
}

案例3:综合使用BufferedReader&BufferedWriter完成文件文本拷贝,注意文件编码。

package li.io.writer_;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter; public class BufferedCopy_ {
public static void main(String[] args) throws Exception {
//注意:BufferedReader 和 BufferedWriter都是字符流操作
// 不要去操作二进制文件[声音,视频,doc,pdf等],可能造成文件损坏 String srcFilePath = "d:\\note.txt";//源文件
String destFilePath = "d:\\note2.txt";
String line = null; //创建BufferedReader&BufferedWriter对象
BufferedReader bufferedReader = new BufferedReader(new FileReader(srcFilePath));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(destFilePath)); //读入和写出
while ((line = bufferedReader.readLine()) != null) {//每读取一行内容就写入
bufferedWriter.write(line);
bufferedWriter.newLine();//换行
} System.out.println("拷贝完毕~"); //关闭两个外层流
bufferedReader.close();
bufferedWriter.close();
}
}

4.4.4字节处理流-BufferedInputStream&BufferedOutputStream

  1. BufferedInputStream

    BufferedInputStream是字节流,在创建BufferedInputStream时会创建一个内部缓冲区数组。

常用方法:

int available()
//用于返回输入流中可用的未读字节数,而不会由于下一次为此InputStream的方法的调用而阻塞。 void close()
//关闭此输入流并释放与该流关联的所有系统资源。 void mark(int readlimit)
//输入流的当前位置做个标记,readlimit参数是输入流在标记位置失效前允许读取的字节数。 boolean markSupported()
//测试输入流是否支持mark和reset方法。 int read()
//读取一个字节。 int read(byte[] b, int off, int len)
//读取多个字节到字节数组b中,参数off是数组偏移量,参数len是读取数据的长度。 void reset()
//重置流的当前位置到前面标记的位置。 long skip(long n)
//略过流中的数据。若数据不够时,跳过仅有的字节,返回跳过的字节数。

  1. BufferedOutputStream

    BufferedOutputStream是字节流,实现缓冲的输出流,可以将多个字节写入底层的输出流中,而不必对每次字节写入调用底层系统


应用案例:

要求:编程完成图片/音乐的拷贝(要求使用 BufferedInputStream 和 BufferedOutputStream 流)

package li.io.outputstream_;

import java.io.*;

/**
* 演示使用 BufferedInputStream 和 BufferedOutputStream
* 使用它们可以拷贝二进制文件
* 同时也可以拷贝文本文件
*/ public class BufferedCopy02 {
public static void main(String[] args) {
String srcFilePath = "d:\\兰亭序 - 周杰伦.mp3";
String destFilePath = "d:\\ltx-zhou.mp3"; //创建BufferedInputStream 和 BufferedOutputStream对象
BufferedInputStream bis = null;
BufferedOutputStream bos = null; try {
bis = new BufferedInputStream(new FileInputStream(srcFilePath));
bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
//循环写入并读取
byte[] buf = new byte[1024];
int readLen = 0;
//read(byte[]):当返回-1时就表示文件读取完毕
while ((readLen = bis.read(buf)) != -1) {
bos.write(buf, 0, readLen);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭外层流
try {
if (bos != null) {
bos.close();
}
if (bis != null) {
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

注意:字节流可以操作二进制文件,同时也可以操作文本文件

day36-IO流03的更多相关文章

  1. IO流(03)--序列化流、打印流

    序列化流 Java提供了一种对象序列化的机制,用一个字节序列可以表示一个对象,该字节序列包含该对象的数据.对象的类型和对象中存储的属性等信息.字节序列写入到文件中后,就相当于在文件中保存了一个对象信息 ...

  2. IO流01--毕向东JAVA基础教程视频学习笔记

    提要 01 IO流(BufferedWriter)02 IO流(BufferedReader)03 IO流(通过缓冲区复制文本文件)04 IO流(readLine的原理)05 IO流(MyBuffer ...

  3. JavaSE_ IO流 总目录(19~22)

    JavaSE学习总结第19天_IO流119.01 集合的特点和数据结构总结19.02 如何选择使用哪种集合19.03 集合常见功能和遍历方式总结19.04 异常的概述和分类19.05 JVM默认处理异 ...

  4. Java之IO流概述和File基本操作

    IO流图解 IO(in / out)流的分类 流向: 输入流  读取数据 输出流  写出数据 数据类型: 字节流 一个字节占8位, 以一个字节为单位读数据 八大数据类型所占字节数: byte(1), ...

  5. Java IO流学习

    Java IO流学习 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是 ...

  6. Java中常用IO流之文件流的基本使用姿势

    所谓的 IO 即 Input(输入)/Output(输出) ,当软件与外部资源(例如:网络,数据库,磁盘文件)交互的时候,就会用到 IO 操作.而在IO操作中,最常用的一种方式就是流,也被称为IO流. ...

  7. C++ STL IO流 与 Unicode (UTF-16 UTF-8) 的协同工作

    09年研究技术的大神真的好多,本文测试有很多错误,更正后发布下(可能与编辑器相关). file.imbue(locale(file.getloc(), new codecvt_utf8<wcha ...

  8. File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?

    重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...

  9. Java基础之IO流

    很长时间都没有更新了,最近在补充JavaSE的一些细节部分 关于IO流的一些总结 首先要介绍的是File类,File类用于对文件和目录的一些操作 1.创建文件CreateNewFile() 2.对文件 ...

随机推荐

  1. 爬虫(9) - Scrapy框架(1) | Scrapy 异步网络爬虫框架

    什么是Scrapy 基于Twisted的异步处理框架 纯python实现的爬虫框架 基本结构:5+2框架,5个组件,2个中间件 5个组件: Scrapy Engine:引擎,负责其他部件通信 进行信号 ...

  2. 面试突击64:了解 HTTP 协议吗?

    HTTP(Hyper Text Transfer Protocol)超文本传输协议,下文简称 HTTP,它的作用是用于实现服务器端和客户端的数据传输的.它可以传输任意的数据类型,如文本.HTML.图片 ...

  3. 分析 java.util.Hashtable 源码

    概述 基于J11,该类已经淘汰,如果使用线程安全的则用 ConcurrentHashMap ,用线程不安全的则使用 HashMap .仅与HashMap进行比较 结构以及依赖关系 HashTable ...

  4. ooday08 Java_多态_向下强制转型

    笔记: 多态: 表现: 同一个对象被造型为不同的类型时,有不同的功能 --对象的多态:我.你.水......------所有对象都是多态的(明天体会) 同一类型的引用指向不同的对象时,有不同的实现 - ...

  5. FPS游戏逆向-方框透视(三角函数)

    本套课程主要学习FPS类游戏安全 由于FPS类游戏本身的特性问题,可能产生一些通用的游戏安全问题 在通过逆向与正向对FPS类游戏分析之后,找到其可能出现的不安全点 才能更好的保护游戏不被外部力量侵犯 ...

  6. 简单易用的任务队列-beanstalkd

    概述 beanstalkd 是一个简单快速的分布式工作队列系统,协议基于 ASCII 编码运行在 TCP 上.其最初设计的目的是通过后台异步执行耗时任务的方式降低高容量 Web 应用的页面延时.其具有 ...

  7. Netty源码解读(三)-NioEventLoop

    先看看EventLoop类图 我们在Netty第二篇文章中的代码中,看到有多次用到eventLoop.execute()方法,这个方法就是EventLoop开启线程执行任务的关键,跟踪进去看看 // ...

  8. 用kubeadm简单部署k8s

    一.环境准备 1.三台CentOS6.7虚拟机 master:192.168.0.54 注意:主节点最好是2颗cpu,否则在k8s控制平面初始化的时候会报错: node1:192.168.0.68 n ...

  9. 字符输出流_Writer类&FileWrite类介绍和字符输出流的基本使用_写出单个字符到文件

    字符输出流_Writer类&FileWrite类介绍 java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类 共性抽象方法: void write(int c) ...

  10. md文档使用小技巧

    简介 在日常写readme文档中,可能会遇到一些小问题,此处记录一下md文档编写过程中的一些小技巧. 插入图片 在md文档中插入图片,目前有三种方式,本地导入.网络导入.base64导入. 本地导入 ...