什么是缓冲流:

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统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. springboot和springcloud版本上的选择

    现在的springboot项目和cloud版本都是更新很快,但我们开发不是版本越新越好,我们要把版本对应起来,那么我们怎么去关联呢? springboot和springcloud不是越新越好,clou ...

  2. x86汇编反编译到c语言之——(1)表达式求值及赋值语句

    一. 反编译一种可能的实现方式 我们的目的是将多种平台的汇编如x86,ARM,6502反编译为c语言,所以实现时先将多种汇编转化为 特定虚拟机汇编语言,然后只需要将虚拟机汇编语言反编译为c语言.其中多 ...

  3. 7.4 k8s结合ceph rbd、cephfs实现数据的持久化和共享

    1.在ceph集群中创建rbd存储池.镜像及普通用户 1.1.存储池接镜像配置 创建存储池 root@u20-deploy:~# ceph osd pool create rbd-test-pool1 ...

  4. 【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析

    问题描述 如何在Windows环境中,不安装第三方软件的情况下(使用Windows内置指令),如何抓取网络包呢?并且如何转换为Wireshark 格式呢? 操作步骤 1) 以管理员模式打开CMD,使用 ...

  5. Linux设置默认的声卡

    首先查看自己电脑上的声卡 使用命令行查看 orangepi@orangepi3:~$ ll /proc/asound/ total 0 dr-xr-xr-x 4 root root 0 Dec 23 ...

  6. Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)

    题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...

  7. 洛谷 P6031 - CF1278F Cards 加强版(推式子+递推)

    洛谷题面传送门 u1s1 这个推式子其实挺套路的吧,可惜有一步没推出来看了题解 \[\begin{aligned} res&=\sum\limits_{i=0}^ni^k\dbinom{n}{ ...

  8. karatsuba乘法

    karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.[1] 此算法主要用于两个 ...

  9. Netty之ByteBuf

    本文内容主要参考<<Netty In Action>>,偏笔记向. 网络编程中,字节缓冲区是一个比较基本的组件.Java NIO提供了ByteBuffer,但是使用过的都知道B ...

  10. 关于learning Spark中文版翻译

      在网上找了很久中文版,感觉都是需要支付一定金币才能下载,索性自己翻译算了.因为对Spark有一定了解,而且书籍前面写道,对Spark了解可以直接从第三章阅读,就直接从第三章开始翻译了,应该没有什么 ...