1.缓冲流

1.1 概述

缓冲流也叫作高效流,是对基本的FileXXX流的增强,所以也是4个流,按照数据类型分为:

字节缓冲流:BufferedInputStream,BuffteredOutputStream

字符缓冲流:BufferedReader,BufferedWriter

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

1.2 字节缓冲流

   构造方法:

public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。

public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。

public class Demo {public static void main(String[] args) throws FileNotFoundException {//创建字节缓冲输入流BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));//创建字节缓冲输出流BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("a.txt"));}
}

效率测试:

1.基本流,代码如下:

public class Demo2 {public static void main(String[] args) {//记录开始时间long start=System.currentTimeMillis();//创建流对象try (FileInputStream fis=new FileInputStream("JDK.exe");FileOutputStream fos=new FileOutputStream("copy.exe");) {//读写数据int b;while ((b=fis.read())!=-1){fos.write(b);}}catch (IOException e) {e.printStackTrace();}//记录结束时间long end=System.currentTimeMillis();System.out.println((end-start));}
}54504

2.使用缓冲流。

public class Demo03 {public static void main(String[] args) throws IOException {//记录开始时间long start=System.currentTimeMillis();//创建流对象BufferedInputStream bis=new BufferedInputStream(new FileInputStream("JDK.exe"));BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("copy1.exe"));//读写数据int b;while (!((b=bis.read())!=-1)){bos.write(b);}long end=System.currentTimeMillis();System.out.println((end-start));}
}4

上述第一个使用基本流用时为54504毫秒。可是使用缓冲流,只有是4毫秒,大大提升了效率。

如果我们想进一步的增加程序的效率呢?

3. 可以使用数组加缓冲流的方法。

public class Demo03 {public static void main(String[] args){//记录开始时间long start=System.currentTimeMillis();//创建流对象try(BufferedInputStream bis=new BufferedInputStream(new FileInputStream("JDK.exe"));BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("copy1.exe"));) {//读写数据int len;byte[] bytes=new byte[8*1024];while (!((len = bis.read(bytes)) != -1)) {bos.write(bytes,0,len);}}catch (IOException e){e.printStackTrace();}long end=System.currentTimeMillis();System.out.println((end-start));}
}

1.3 字符缓冲流

  构造方法:

public BufferedReader(Reader in) :创建一个 新的缓冲输入流。

public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。

public class Demo {public static void main(String[] args) throws IOException {//创建字符缓冲输入流BufferedReader br=new BufferedReader(new FileReader("a.txt"));//创建字符缓冲输出流BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));}
}

  特有方法 

字符缓冲流的特有方法有:

BufferedReader: public String readLine() : 读一行文字。

BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。

readline方法演示;

public class Demo04 {public static void main(String[] args) throws IOException {//创建流对象BufferedReader br=new BufferedReader(new FileReader("a.txt"));//定义字符串,保存读取的一行文字String line=null;//循环读取while ((line=br.readLine())!=null){System.out.println(line);System.out.println("-----");}//释放资源br.close();}
}

newline方法演示:

public class Demo04 {public static void main(String[] args) throws IOException {//创建流对象BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));//写出数据bw.write("路飞");//写出换行bw.newLine();//写出数据bw.write("索隆");//写出换行bw.newLine();//写出数据bw.write("山治");//写出换行bw.newLine();//释放资源bw.close();}
}

1.4 练习:文本排列

需求:恢复数据

3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉
以咨之,然后施行,必得裨补阙漏,有所广益。
8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其
咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,
必能使行阵和睦,优劣得所。
2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不
宜偏私,使内外异法也。
1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外
者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以
塞忠谏之路也。
9.今当远离,临表涕零,不知所言。
6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣
以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐付托不效,以伤先帝之明,故五月渡泸,深入不毛。
今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛
下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息
痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。

分析:

1.逐行读取文本信息

2.解析文本信息到集合中

3.遍历集合,按顺序,写出文本信息

public class Demo {public static void main(String[] args) throws IOException {//创建map集合,保存文本数据,间为序号,值为文字HashMap<String, String> linMap=new HashMap<>();//创建流对象BufferedReader br=new BufferedReader(new FileReader("in.txt"));BufferedWriter bw=new BufferedWriter(new FileWriter("copy2.txt"));//读取数据String line;while ((line=br.readLine())!=null){//解析文本String[] split=line.split("\\.");//保存到集合linMap.put(split[0],split[1]);}//释放资源br.close();//遍历集合for (int i = 1; i <linMap.size() ; i++) {String key=String.valueOf(i);//获取map中的文本String value=linMap.get(key);//写出拼接文本bw.write(key+"."+value);//写出换行bw.newLine();}//释放资源bw.close();br.close();}
}

2.转换流

  2.1 字符编码和字符集

字符编码:计算机中存储信息都是使用二进制数表示的,我们在屏幕上看到的所有信息都是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,成为编码。同样,将计算机中的二进制数按照某种规则解析显示出来,成为解码。如果按照A规则进行编码,那么就按照A规则就行解码,就能正确显示,要是按照被的规则进行解码,就会乱码。

字符编码;character  Encoding:就是一套自然语言的字符与二进制数之间的对应规则。

      字符集:charset,也叫编码表。是一个系统支持的所有字符的集合,包括国家文字、标点符号、数字等。

计算机要准确的存储和和识别各种字符集符号,就需要进行字符编码,一套字符集至少有一套字符编码。常见饿字符集有ASCII字符集、GBK字符集、Unicode字符集等。

当指定了编码,它所对应的的字符集就自然指定了,所以编码才是我们终于要关心的。

ASCII字符集

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套                          电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字                        符、阿拉伯数字和西文符号)

基本的ASCII字符集,使用7位(bits)表示一个字符,共128字符。ASCII的扩展字符集使用8位(bits)表示一个                           字符,共256字符,方便支持欧洲常用字符。

  ISO-8859-1字符集

拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。

ISO-5559-1使用单字节编码,兼容ASCII编码。

GBxxx字符集:

GB就是国标的意思,是为了显示中文而设计的一套字符集。

GB2312:简体中文码表。一个小于127的字符的意义与原来相同。但两个大于127的字符连在一起时,

就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日                                              文 的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编                                              码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了

GBK:  最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个                                            汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。

GB18030:最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支                                                  持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。

Unicode字符集

Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。

它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF-32。                                最为常用的UTF-8编码。

UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页及其他存储或传送文字的应用中,优                              先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。所以,我们开发Web                            应用,也要使用UTF-8编码。它使用一至四个字节为每个字符编码,编码规则:

1 128个US-ASCII字符,只需一个字节编码。

2 拉丁文等字符,需要二个字节编码。

3 大部分常用字(含中文),使用三个字节编码。

4 其他极少使用的Unicode辅助字符,使用四字节编码。

2.2 编码引出的问题

在IDEA中,使用FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8 编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。

public class Demo05 {public static void main(String[] args) throws IOException {FileReader fr=new FileReader("D:\\e.txt");int read;while ((read=fr.read())!=-1){System.out.println((char)read);}}
}												

java 缓冲流 转换流、序列化流、打印流相关推荐

  1. Java基础19:IO流—缓冲流、转换流、序列化、打印流、压缩流和解压流

    IO流中的一些其他流:缓冲流.转换流.序列化.打印流.压缩流和解压流 1. 缓冲流 IO流除了一些基本的流,还有在此基础上发展出来的一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够 ...

  2. JavaSE(字符流、IO资源的处理、属性集、ResourceBundle工具类、缓冲流、转换流、序列化、打印流、装饰设计模式、commons-io工具包)

    JavaSE 字符流 字符输入流[Reader] 字符输入流Reader类的概述 字符输入流Reader类的常用方法 FileReader类 FileReader类的概述 FileReader类的构造 ...

  3. Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)

    1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...

  4. 【02】Java进阶:13-IO资源的处理、属性集、缓冲流、转换流、序列化、打印流、装饰设计模式、commons-io工具包

    day13[Properties类.缓冲流.转换流.序列化流.装饰者模式.commons-io工具包] 今日内容 IO异常处理 Properties类 缓冲流 转换流 序列化\反序列化流 打印流 装饰 ...

  5. Java基础-9(缓冲流,转换流,序列化,打印流,TCP通信程序)

    51.缓冲流 概述 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流:BufferedInputStream,BufferedOutputSt ...

  6. 【java笔记】字符流,Properties,序列化,打印流

    字符流 字符流=字节流+编码 package demo04;import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  7. Java IO学习笔记(四)打印流

    1.只有输出流才有打印流:PrintWriter和PrintStream分别针对字符和字节,提供了重载的print,Println方法用于多种数据类型的输出.PrintWriter和PrintStre ...

  8. stream流去除对象的值_I/O流(过滤流、对象序列化、字符流)

    过滤流基础 Data Stream 首先我们来介绍一对过滤流:DataInputStream 和 DataOutputStream.这两个类有什么作用呢?首先来思考下面的需求:假设,要把一个 doub ...

  9. java 数字大小写转换工具类--适用于打印收据

    本工具类主要实现数字double1000.00====>>零万壹仟零佰零拾零元零角零分,注释很详细,就不多做介绍了 /*** 不考虑分隔符的正确性*/private static fina ...

  10. 【Java基础】Java IO编程:输入输出流、内存流、打印流、缓冲流BufferedReader、扫描流Scanner、序列化与反序列化

    文章目录 第11章.Java IO编程 11.1 文件操作类:File 11.2 字节流与字符流 字节输出流:OutputStream OutputStream类 FileOutputStream类 ...

最新文章

  1. java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文
  2. 对象的序列化和反序列化
  3. 用C++/CLI搭建C++和C#之间的桥梁(一)—— 简介
  4. linux 卸载java jdk1.6_Linux/CentOS 卸载系统原装jdk1.4 和安装jdk1.6.1
  5. 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)
  6. cloudwatch_将CloudWatch Logs与Cloudhub Mule集成
  7. ERROR ITMS-90206:Invalid Bundle. The bundle at ‘xx.app/xx/xx.framework' contan
  8. LabelSmoothing标签平滑
  9. vue中怎么点击修改文字_怎么拍照识别文字?什么软件可以识别照片中文字?
  10. idea打包servlet成war包部署在tomcat
  11. xcap工具使用心得
  12. Moldflow 2018模流分析从入门到精通pdf txt mobi读书笔记
  13. 征战牛市!HASHBOX第二期矿场行活动完美落幕
  14. 小红拿到了一个数组,她想取一些数使得取的数之和尽可能大,但要求这个和必须是 k 的倍数。你能帮帮她吗?
  15. FM立体声 matlab 左右,FM立体声收音机的制作
  16. 兔子数列 - C语言
  17. outlook邮箱邮件大小限制_Office Outlook 2010、2013附件大小超过了允许的范围限制三种解决方法图解...
  18. 使用阿里云提供的短信服务发送短信(个人版)
  19. C语言的指南针——指针与结构体
  20. SmartFoxServer(SFS) 是什么?

热门文章

  1. DTS CD转出为MP3格式
  2. 在网站插入微博,静态的网页出的来,到服务器出不来,新浪微博生成的微博秀代码,在静态页面能显示小弟我放到自己的.net页面里就显示不了...
  3. 2018最新BIM设计的秘密武器——揭秘全球顶级工程设计师的杀手锏
  4. 喜欢你的人和你喜欢的人 前面 后面
  5. [转]ubuntu 下安装网易云音乐
  6. 【普通人题解】LeetCode174. 地下城游戏
  7. 在wincc中编辑语言c的另一个应用领域是关于动态向导的创建,wincc的c语言基础
  8. IBM的营销策略纲要
  9. python爬虫关键词抓手机号_通过Python爬虫按关键词抓取相关的新闻
  10. PHP、Tomcat获取Nginx代理后的客户端真实IP