18_星仔带你学Java之IO操作②

大家好,我是💖星仔💖。一个致力于为大家分享各种Java知识的博主。

✨专栏汇总✨

        🍋《星仔带你部署银河麒麟RAM架构服务器》

        🍋《星仔带你学消息队列(RebbitMQ)》

        🍋《星仔带你学Java》

        🍋《星仔带你学Elasticsearch》

        🍋《星仔带你搞定Java开发小技巧》

        🍋《星仔带你学Java设计模式》

        🍋《星仔带你搞定【软考-系统架构设计师】》

        🍋《星仔带你玩转Java面试》

    本博客收录于《华星详谈-学习中心》。本学习中心收集了Java整个技术体系的所有技术要点。每篇博客后面或者知识点结尾都附带有面试题,提供给大家巩固本章内容。

为各位同胞们能够系统性的掌握整个Java技术体系而建立的学习中心。星仔正在努力的更新学习中心中的内容。望诸君共勉!!!

🍋一、字节流

🍒1.1 案例1

文件拷贝案例 - 拷贝指定目录的指定类型文件到指定目录

分析比如把C:/java目录中所有的java文件拷贝到D:/text/把拷贝的所有文件的拓展名改为.txt.

🍒1.2 案例2

获取进程数据 - 编译和运行Java代码

🍋二、 文件字符流

🍒2.1 概述

文件的字节流分为FileInputStream、FileOutputStream。

文件的字符流分为FileReader、FileWriter。

在使用字节流操作汉字或特殊的符号语言的时候,容易出现乱码,故建议使用字符流。在Java中是先有字节流,后有字符流字符流是对字节流的补充。

🍒2.2 字节流和字符流使用场景

        使用记事本打开某个文件可以看到内容的就是文本文件,否则可以理解二进制。操作二进制文件(图片音频视频等必须使用字节流;操作文本文件使用字符流;如果不清楚是哪一类型文件则使用字节流。

🍒2.3 flush方法

        输出流中都有flush(刷新)方法。计算机访问外部设备(磁盘文件),要比直接访问内存慢很多,如果每次write都要直接写出到磁盘文件中CPU都会花更多的时间,此时我们可以准备一个内存缓冲区,程序每次write方法都是直接写到内存缓冲区中,当内存缓冲区满后系统才把缓冲区内容一次性写出给磁盘文件。

使用缓冲区的好处:

  1:提高CPU使用率

  2:有机会回滚写入的数据

对于字节流,flush方法不是都有作用部分字节流才有作用,对于字符流都起作用如果我们调用close方法,系统在关闭资源前,会先调用flush方法

ps:操作系统使用-1表示磁盘文件的结尾标记,缓冲区大小一般使用容量整数倍,可以提高IO性能。

🍋三、字符编码

🍒3.1 字符编码的发展历程

阶段1:

计算机只认识数字,我们在计算机里一切数据都是以数字来表示,因为英文符号有限,

所以规定使用的字节的最高位是0。每一个字节都是以0~127之间的数字来表示比如A对应65,a对应97

这就是美国标准信息交换码-ASCII。

阶段2:

随着计算机在全球的普及,很多国家和地区都把自己的字符引入了计算机,比如汉字

此时发现一个字节能表示数字范围太小,不能包含所有的中文汉字,那么就规定使用两个字节来表示一个汉字

规定:原有的ASCII字符的编码保持不变,仍然使用一个字节表示。为了区别一个中文字符与两个ASCII码字符,

中文字符的每个字节最高位规定为1(中文的二进制是负数)。这个规范就是GB2312编码,

后来在GB2312的基础上增加了更多的中文字符(比如汉字)也就出现了GBK。

阶段3:

新的问题:在中国是认识汉字的,但是如果把汉字传递给其他国家,该国家的码表中没有收录汉字,其实就显示另一个符号或者乱码

为了解决各个国家因为本地化字符编码带来的影响,咱们就把全世界所有的符号统一进行编码-Unicode编码。

此时某一个字符在全世界任何地方都是固定的,比如'',在任何地方都是以十六进制的54E5来表示。

Unicode的编码字符都占有2个字节大小。

🍒3.2 常见的字符集

        1)ASCII:占一个字节只能包含128个符号,不能表示汉字;

        2)ISO-8859-1(latin-1):占一个字节,收录西欧语言,不能表示汉字;

        3)ANSI:占两个字节简体中文的操作系统中 ANSI 就指的是 GB2312;

        4)GB2312/GBK/GB18030:占两个字节,支持中文;

        5)UTF-8:一种针对Unicode的可变长度字符编码,又称万国码。是Unicode的实现方式之一;

        6)UTF-8 BOM:是MS搞出来的编码默认占3个字节,不建议使用;

        

        UTF-8编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。

🍒3.3 存储字母、数字和汉字

        1)存储字母和数字无论是什么字符集都占1个字节;

        2)存储汉字:GBK家族占两个字节,UTF-8家族占3个字节不能使用单字节的字符集(ASCII/ISO-8859-1)来存储中文。

🍒3.4 字符的编码和解码操作

  编码把字符串转换为byte数组;

  解码byte数组转换为字符串;

注意:一定要保证编码和解码的字符相同,否则会出现乱码

🍋四、包装流和缓冲流

🍒4.1 概述

   1:隐藏了底层的节点流的差异,并对外提供了更方便的输入/输出功能,让我们只关心高级流的操作;

   2:使用处理流包装了节点流,程序直接操作处理流,让节点流与底层的设备做IO操作;

   3:只需要关闭处理流即可

写代码的时候发现创建对象的时候,需要传递另一个流对象,此时就是包装流。

   new  包装流( 流对象  ) ;

🍒4.2 什么是缓冲流

   缓冲流是一个包装流,其目的起缓冲作用。BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter都是缓冲流/包装流;

🍒4.3 缓冲流/包装流的目的

操作流的时候我们习惯定义一个byte/char数组。

   int read():每次都从磁盘文件中读取一个字节.  直接操作磁盘文件性能极低.

解决方案: 定义一个数组作为缓冲区

byte[] buffer = new byte[1024]; 该数组其实就是一个缓冲区.

        一次性从磁盘文件中读取1024个字节如此以来操作磁盘文件的次数少了,即性能得以提升。既然我们都能想到,SUN公司早就想到了。在Java中提供的默认缓存区大小是8192(1024*8),我们一般不用修改大小

   

🍒4.4 节点流和缓冲流性能对比

  操作字节和字符流都习惯使用缓冲流给包装起来,来提供IO性能/效率。

故能够得出结论:缓冲流性能比节点流性能要好一些。

🍋五、转换流和内存流

🍒5.1 转换流

转换流:把字节流转成字符流

   InputStreamReader:把字节输入流转成字符输入流.

   OutputStreamWriter把字节输出流转成字符输出流.

为什么有字节转字符流,没有字符转字节流?

     1)字节流可以操作一切文件(纯文本文件/二进制文件).

     2)字符流是用来操作中文纯文本使用的,本身是对字节流的增强.

🍒5.2 内存流(数组流)

内存流数组流):把数据先临时存在数组中,待会再从数组中获取出来。比较典型的就是适配器模式。

   1) 字节内存流: ByteArrayInputStream/ByteArrayOutputStream

   2) 字符内存流: CharArrayReader/CharArrayWriter

   3) 字符串流:StringReader/StringWriter(把数据临时存储到字符串中)

 

 

🍋六、合并流

合并流/顺序流(SequenceInputStream):就是把多个输入流,合并成一个流对象。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华星详谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值