什么是缓冲流:

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
图解:

1、字节缓冲流BufferedInputStream;BufferedOutputStream:

  • public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
  • public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。

案例对比:

使用缓冲流,拷贝文件每次拷贝1024字节

import java.io.*;

/**
* @ClassName FileCopyTryCatchBuffer
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/17.
*/
public class FileCopyTryCatchBuffer {
public static void main(String[] args) {
String srcPath = "C:\\Users\\ZHANGMINGDA\\Pictures\\康熙北巡.jpg";
String dstpath = "C:\\Users\\ZHANGMINGDA\\Pictures\\康熙北巡bak.jpg";
byte[] tmpbytes = new byte[1024];
int copyLength;
long startTime = System.currentTimeMillis();
try(InputStream bfis = new BufferedInputStream(new FileInputStream(srcPath));
OutputStream bfos = new BufferedOutputStream(new FileOutputStream(dstpath))){
while ((copyLength = bfis.read(tmpbytes)) != -1){
bfos.write(tmpbytes,0,copyLength);
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("拷贝花费ms时间:" + (endTime - startTime));
}
}

不使用缓冲流,拷贝文件每次拷贝1024字节

import java.io.*;

/**
* @ClassName FileCopyBytesExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/17.
*/
public class FileCopyBytesExample {
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
String srcPath = "C:\\Users\\ZHANGMINGDA\\Pictures\\康熙北巡.jpg";
String dstpath = "C:\\Users\\ZHANGMINGDA\\Pictures\\康熙北巡bak.jpg";
InputStream fis = new FileInputStream(srcPath);
OutputStream fos = new FileOutputStream(dstpath);
byte[] tmpBytes = new byte[1024];
int length ;
while ((length = fis.read(tmpBytes)) != -1) {
fos.write(tmpBytes,0,length);
}
long endTime = System.currentTimeMillis();
fis.close();
fos.close();
System.out.println("拷贝耗时ms:" + (endTime -startTime));
}
}

2、字符缓冲流BufferedReader(Reader in);BufferedWriter(Writer out) :

构造方法:
  • public BufferedReader(Reader in) :创建一个新的缓冲输入流。
  • public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。
看它们具备的特有方法:
  • BufferedReader: public String readLine() : 读一行文字。读到最后一行返回null。
  • BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。

练习:打乱的诗词排序

1->独立寒秋,湘江北去,橘子洲头。
2->看万山红遍,层林尽染;
3->漫江碧透,百舸争流。
4->鹰击长空,鱼翔浅底,
5->万类霜天竞自由。

使用treeSet 对诗词语句排序:

import java.io.*;
import java.sql.SQLOutput;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet; /**
* @ClassName TextCopyTryCatchExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/18.
*/
public class TextCopyTryCatchExample {
public static void main(String[] args){
String srcpath = "输入输出文件读写/src/test/output/沁园春雪-长沙.txt";
String dstpath = "输入输出文件读写/src/test/output/沁园春雪-长沙-sort.txt"; try (BufferedReader bufferedReader = new BufferedReader(new FileReader(srcpath));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(dstpath))) {
String tmpStringLine ; //存放临时的每行文本
Map<Integer,String> tmpMap = new HashMap<>(); //存放诗词语句和顺序序号的对应
TreeSet<Integer> indexSet = new TreeSet(); //对数字排序
while ((tmpStringLine = bufferedReader.readLine()) != null){
String[] tmpLineArr = tmpStringLine.split("->");
int indexKey = Integer.parseInt(tmpLineArr[0]);
indexSet.add(indexKey); //TreeSet 集合插入元素按数字大小进行自动排序1,2,3...
tmpMap.put(indexKey,tmpLineArr[1]); //Map集合
}
//按顺序遍历,写入到新文件
for(Integer index : indexSet){
System.out.println(index);
bufferedWriter.write(index + "->" + tmpMap.get(index));
bufferedWriter.newLine();
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e ){
e.printStackTrace();
}finally {
}
}
}
排序需求其实可以不用TreeSet也行。
HashMap具体的数据要存放在某个位置,是不是通过key的hashCode()来计算的。其实,HashMap会根据这个key的hashCode来对我们的数据进行排序。为什么HashMap的key又是无序的,这个是因为hashCode是通过对应的变量在内存里面的地址计算出来。但是Integer的hashCode就是它自己。所以说,我们加入了Integer的key之后,HashMap会通过key从小到大给我们排序。

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* @ClassName TextCopyHashMap
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/18.
*/
public class TextCopyBufferWriterHashMap {
public static void main(String[] args) {
String srcPath = "输入输出文件读写/src/test/output/沁园春雪-长沙.txt";
String dstPath = "输入输出文件读写/src/test/output/沁园春雪-长沙-HashMapSort.txt";
try(BufferedReader bufferedReader = new BufferedReader(new FileReader(srcPath));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(dstPath))) {
String tmpLine ;
Map<Integer,String> textMap = new HashMap<>();
while ((tmpLine = bufferedReader.readLine()) != null){
String[] tmpLineArr = tmpLine.split("->");
Integer lineIndex = Integer.parseInt(tmpLineArr[0]);
textMap.put(lineIndex,tmpLineArr[1]);
}
System.out.println(textMap); //{1=独立寒秋,湘江北去,橘子洲头。, 2=看万山红遍,层林尽染;, 3=漫江碧透,百舸争流。, 4=鹰击长空,鱼翔浅底,, 5=万类霜天竞自由。}
for(Integer index : textMap.keySet()){
bufferedWriter.write(textMap.get(index));
bufferedWriter.newLine();
}
/**
* 独立寒秋,湘江北去,橘子洲头。
* 看万山红遍,层林尽染;
* 漫江碧透,百舸争流。
* 鹰击长空,鱼翔浅底,
* 万类霜天竞自由。
*/
//复习Map.entrySet() 取值
Set entrySet = textMap.entrySet();
for(Object o : entrySet){
Map.Entry<Integer,String> a = (Map.Entry<Integer,String>)o;
System.out.println(a.getKey() + a.getValue());
/**
* 1独立寒秋,湘江北去,橘子洲头。
* 2看万山红遍,层林尽染;
* 3漫江碧透,百舸争流。
* 4鹰击长空,鱼翔浅底,
* 5万类霜天竞自由。
*/
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
}

java 输入输出IO流 字节流| 字符流 的缓冲流:BufferedInputStream;BufferedOutputStream;BufferedReader(Reader in);BufferedWriter(Writer out)的更多相关文章

  1. Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter

    在上一篇文章中Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream介绍了缓冲流中的字节流,而这一篇着重介绍缓冲流中字符流Buffered ...

  2. Java IO学习笔记(二)缓冲流

    处理流:包在别的流上的流,可以对被包的流进行处理或者提供被包的流不具备的方法. 一.缓冲流:套接在相应的节点流之上,带有缓冲区,对读写的数据提供了缓冲的功能,提高读写效率,同时增加一些新的方法.可以减 ...

  3. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

  4. Java第三阶段学习(四、缓冲流)

    一.缓冲流: Java中提供了一套缓冲流,它的存在,可提高IO流的读写速度 缓冲流,根据流的分类分为:字节缓冲流与字符缓冲流. 二.字节缓冲流: 字节缓冲流根据流的方向,共有2个: 1.写入数据到流中 ...

  5. java 输入输出IO 转换流-字符编码

    编码和其产生的问题: 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果. 按照某种规则,将字符存储到计算机中,称为编码 .反之,将存 ...

  6. java 输入输出IO流 字符流 FileWriter FileReader

    为什么要使用字符流 当使用字节流读取文本文件时,可能会有一个小问题.就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以Java提供一些字符流类,以字符为单位读写 ...

  7. Java之IO流(字节流,字符流)

    IO流和Properties IO流 IO流是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键, 因而所有 I/O 的主体实际上是内置在操作系统中的.单独的 ...

  8. java 输入输出IO流:FileOutputStream FileInputStream

    什么是IO: 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了.当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里.那么数据都是在哪些设备上 ...

  9. IO 复习字节流字符流拷贝文件

    /* 本地文件 URL 文件拷贝 *//*文本文件拷贝 可以通过 字符流,也可以通过字节流*/ /*二进制文件拷贝 只可以通过字节流*//* 希望这个例子能帮助搞懂 字符流与字节流的区别 */ imp ...

随机推荐

  1. 洛谷 P7116 - [NOIP2020] 微信步数(拉格朗日插值)

    洛谷题面传送门 我竟然独立切掉了这道题!incredible! 纪念我逝去的一上午(NOIP 总时长 4.5h,这题做了我整整 4.5h) 首先讲一下现场我想的 80 分的做法,虽然最后挂成了 65 ...

  2. Godunov's 定理

    Godunov's theorem 转自Wiki 目录 Godunov's theorem 简介 定理 定理1. 单调保持性(Monotonicity preserving) 定理2. Godunov ...

  3. Perl去重fasta序列

    常规方法 #! usr/bin/perl -w use strict; my $input=shift; my %hash; open IN,"<$input"; $/=&q ...

  4. Jvarkit : Java utilities for Bioinformatics

    Jvarkit : Java utilities for Bioinformatics :一个java写的生物信息工具包:http://lindenb.github.io/jvarkit/

  5. 深度探讨 PHP 之性能

    1.缘起 关于PHP,很多人的直观感觉是PHP是一种灵活的脚本语言,库类丰富,使用简单,安全,非常适合WEB开发,但性能低下.PHP的性能是否真的就 如同大家的感觉一样的差呢?本文就是围绕这么一个话题 ...

  6. 02 eclipse中配置Web项目(含eclipse基本配置和Tomcat的配置)

    eclipse搭建web项目 一.Eclipse基本配置 找到首选项: (一)配置编码 (二)配置字体 (三)配置jdk (四)配置Tomcat 二.Tomcat配置 三.切换视图,检查Tomcat ...

  7. c/c++在线编译Output Limit Exceeded(OLE)错误

    提示输出错误,有如下两个可能情况: 1. 不符合题目给出的输出格式,自己输出了多余的内容或者格式不正确 2. 输入数据的时候,未考虑到输入错误的情况 针对2,有如下的例子: 错误的情况: 1 int ...

  8. 日常Java 2021/11/9

    线程的优先级 每一个Java线程都有一个优先级,这样有助于操作系统确定线程的调度顺序.Java线程的优先级是一个整数,其取值范围是1(Thread.MIN_PRIORITY ) -10 (Thread ...

  9. Angular 中 [ngClass]、[ngStyle] 的使用

    1.ngStyle 基本用法 1 <div [ngStyle]="{'background-color':'green'}"></<div> 判断添加 ...

  10. 什么是 IP 地址 – 定义和解释

    IP 地址定义 IP 地址是一个唯一地址,用于标识互联网或本地网络上的设备.IP 代表"互联网协议",它是控制通过互联网或本地网络发送的数据格式的一组规则. 本质上,IP 地址是允 ...