一、缓冲流:

Java中提供了一套缓冲流,它的存在,可提高IO流的读写速度

缓冲流,根据流的分类分为:字节缓冲流与字符缓冲流。

二、字节缓冲流:

字节缓冲流根据流的方向,共有2个:

1.写入数据到流中,字节缓冲输出流 BufferedOutputStream

2. 读取流中的数据,字节缓冲输入流 BufferedInputStream

它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度

2.1字节缓冲输出流 BufferedOutputStream类

public class BufferedOutputStreamDemo01 {
public static void main(String[] args) throws IOException { //写数据到文件的方法
write();
} /*
* 写数据到文件的方法
* 1,创建流
* 2,写数据
* 3,关闭流
*/
private static void write() throws IOException {
//创建基本的字节输出流
FileOutputStream fileOut = new FileOutputStream("abc.txt");
//使用高效的流,把基本的流进行封装,实现速度的提升
BufferedOutputStream out = new BufferedOutputStream(fileOut);
//2,写数据
out.write("hello".getBytes());
//3,关闭流
out.close();
}
}

2.2字节缓冲输入流 BufferedInputStream类

private static void read() throws IOException {
//1,创建缓冲流对象
FileInputStream fileIn = new FileInputStream("abc.txt");
//把基本的流包装成高效的流
BufferedInputStream in = new BufferedInputStream(fileIn);
//2,读数据
int ch = -1;
while ( (ch = in.read()) != -1 ) {
//打印
System.out.print((char)ch);
}
//3,关闭
in.close();
}

练习题:利用缓冲字节流复制文件

package com.oracle.demo02;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; //缓冲字节流
public class BufferCopy { public static void main(String[] args) throws IOException {
long time1=System.currentTimeMillis();
//1.确定数据源
FileInputStream fis=new FileInputStream("e:\\java\\eclipse.zip");
BufferedInputStream bis=new BufferedInputStream(fis);
//2.确定目标地
FileOutputStream fos=new FileOutputStream("d:\\java\\java\\dandan\\eclipse.zip");
BufferedOutputStream bos=new BufferedOutputStream(fos);
//3.读取与写入
int len=0;
byte[] bytes=new byte[1024];
while((len=bis.read(bytes))!=-1){
bos.write(bytes);
}
//4.刷新并释放资源
bos.flush();
bos.close();
bis.close();
long time2=System.currentTimeMillis();
System.out.println("所用时间:"+(time2-time1)/1000+"秒");
} }

 三、字符缓冲流

1. 字符缓冲输入流 BufferedReader

2.  字符缓冲输出流 BufferedWriter

完成文本数据的高效的写入与读取的操作

3.1字符缓冲输入流BufferedReader类

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

特殊方法:

readLine() 读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

package com.oracle.Demo01;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; public class Demo02 {
//字符缓冲输入流
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr=new FileReader("e:\\java\\output.txt");
BufferedReader br=new BufferedReader(fr);
//读取一个文本行的方法 .readLine() 返回值为String 用null来控制循环
//while循环方法读取
String str=null;
while((str=br.readLine())!=null){ //当返回值为null时,说明读取不到字符了
System.out.println(str);
}
//普通方法读取
// String str1=br.readLine();
// System.out.println(str1);
// String str2=br.readLine();
// System.out.println(str2);
// String str3=br.readLine();
// System.out.println(str3); //当读取不到内容时,会返回null
br.close();
} }

3.2字符缓冲输出流BufferedWriter类

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

特殊方法:

newLine() 根据当前的系统,写入一个换行符。

package com.oracle.Demo01;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; public class Demo01 {
//字符缓冲输出流
public static void main(String[] args) throws IOException {
//1.确定目的地
FileWriter fw=new FileWriter("e:\\java\\output.txt",true);
//2.封装为字符缓冲流
BufferedWriter bw=new BufferedWriter(fw);
//3.写入数据
bw.write("你好吗");
bw.newLine(); //字符缓冲输出流,换行的方法:.newLine();
bw.flush();
bw.write("我很好"); //刷新流并不会关闭流,所以可以继续输出
bw.close(); } }

练习题:利用缓冲流进行文件复制

package com.oracle.Demo01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class BufferedCopy {
//缓冲字符流的复制
public static void main(String[] args) throws IOException {
//1.获取数据源
FileReader fr=new FileReader("e:\\java\\output.txt");
//2.封装成缓冲流
BufferedReader br=new BufferedReader(fr);
//3.获取目的地
FileWriter fw=new FileWriter("e:\\java\\copy.txt",true);
//4.封装成缓冲流
BufferedWriter bw=new BufferedWriter(fw);
//5.读取与写入
String str=null;
while((str=br.readLine())!=null){
bw.write(str);
bw.newLine(); //因为读取时是用文本行方法读取的,所以为了格式统一,需要加入换行方法
}
//6.释放资源
bw.newLine();
bw.close();
br.close();
} }

Java第三阶段学习(四、缓冲流)的更多相关文章

  1. Java第三阶段学习(五、流的操作规律、Properties流、序列化流与反序列化流、打印流、commons-IO jar包)

    一.流的操作规律 四个明确: 明确一:明确要操作的数据是数据源还是数据目的地 源:InputStream   Reader 目的地:OutputStream Writer 先根据需求明确是要读还是写 ...

  2. Java第三阶段学习(三、字符流、转换流)

    一.字节流读取中文时出现的问题: 文件中有中文时,用字节流读取会出现乱码的问题,因为一个中文为两个字节. 二.字符编码表 编码表:其实就是生活中字符和计算机二进制的对应关系表. 1.ascii: 一个 ...

  3. Java第三阶段学习(十四、JSP动态页面、EL表达式、JSTL标签库)

    一.JSP技术 1.jsp脚本和注释 jap脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部,比如写在doget.dopost 内的代码 2) ...

  4. Java第三阶段学习(二、IO流--------递归,字节流Stream)

    一.递归 定义:指方法在方法内调用自己 适用于方法的运算主体不变,但运行的时候,参与运算的方法参数会变化注意:一定要给递归一个出口,否则内存溢出 练习题1:使用递归打印文件夹中所有的文件,包含子目录中 ...

  5. Java第三阶段学习(一、IO流------File类)

    一.IO概述: 把内存中的数据存入到硬盘(持久化设备)中叫做:输出(写)Output操作.JAVA软件往电脑硬盘上走叫输出. 把硬盘中的数据读取到到内存里叫做:输入(读)Input操作.电脑硬盘上往J ...

  6. Java第三阶段学习(八:网络通信协议、UDP与TCP协议)

    一.网络通信协议 1.概念: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传 ...

  7. Java第三阶段学习(十二、HttpServletRequest与HttpServletResponse)

    一.HttpServletRequest 1.概述: 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和 ...

  8. Java第三阶段学习(十一、Servlet基础、servlet中的方法、servlet的配置、ServletContext对象)

    一.Servlet简介  1.什么是servlet: sun公司提供的一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API动态的向 ...

  9. Java第三阶段学习(十、XML学习)

    一.XML学习 1.模拟Servlet执行 在学习完前端及java与数据库后,将进行WEB编程阶段的学习.在WEB编程中,可以通过浏览器访问WEB服务器上的数据.这时WEB服务器就相当于另一台计算机. ...

随机推荐

  1. Head内常用标签

    一.标签分类 1.1 自闭和标签 自闭和标签只有开头没有结尾,自动闭合: <meta> 标签 <link> 标签 1.2主动闭合标签 有开头也有结尾,是主动闭合的,称为主动闭合 ...

  2. JAVA 线程池基本总结

    合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第三:提高线程 ...

  3. servlet拦截器

    servlet拦截未登录的用户请求 java代码: package com.gavin.filter; import java.io.IOException; import javax.servlet ...

  4. vue 倒计时返回首页

    1. vue页面15分钟无操作时返回首页 2. 基于vue的倒计时demo 3. 在vue2.0项目中一个简单的倒计时功能 4. vue重新发送验证码 5. 表格<td>里面文字垂直显示

  5. Mongodb 笔记01 MongoDB 简介、MongoDB基础知识、启动和停止MongoDB

    MongoDB 简介 1. 易于使用:没有固定的模式,根据需要添加和删除字段更加容易 2. 易于扩展:MongoDB的设计采用横向扩展.面向文档的数据模型使它能很容易的再多台服务器之间进行分割.自动处 ...

  6. jQuery 动态标签生成插件

    前言: 最近对js的插件封装特别感兴趣,无耐就目前的技术想做到js的完全封装,还是有一定困难,就基于jQuery封装了一个小的插件,而且是基于对象级开发的,不是添加全局方法.高深的语法几乎没有,就有一 ...

  7. SHA-1(安全哈希算法实现)

    如题,不知道sha-1的自己百度吧. #include <iostream> #include <vector> //定义vector数组 #include <strin ...

  8. 【leetcode 简单】 第九十八题 第三大的数

    给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...

  9. datatable表格框架服务器端分页查询设置

    更多内容推荐微信公众号,欢迎关注: js代码如下: $('#mytable').dataTable( { "bServerSide": true, //开启服务器模式,使用服务器端 ...

  10. HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js

    太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章," ...