一、计算机组成原理常识:
- 推荐文章《CPU:这个世界慢!死!了!》,观后感编写代码要尽量减少程序的IO操作。
- CPU: 计算机进行运算的地方,也可以说电脑执行指令的地方。 运算速度是最快的,快到什么程度你看了《CPU:这个世界慢死了!》就知道快的是多夸张了。 当然价格也是最贵的这也是电脑为什么内存、硬盘不能都用CPU来存放的原因。
- 内存: cpu运算数据、运算结果存放的地方。 容量小,断电丢失。
- 硬盘: 存放“永久数据”(文件、图片、音频、视频)的地方。 容量大,断电不丢失。
- 他们之间的关系: cpu是核心,内存是cpu的工作空间,硬盘存放内存工作空间结果数据的仓库,也可以存起他杂物数据。
二、IO的来源:
- 文件的本质:
一切的文件都是字节流。包括二进制文件、音频文件、文本文件、Html文件…等等。
字节流:一段一段的字节(8Byte)的组成。之所以叫字节流是因为程序读取文件本质是读取的字节,当程序读取文件(.mp4、.word)时字节就像一条河流一样流进程序里面,故有字节流一说。
对字节流的操作简称为IO(Input Output)。
- 为什么程序读取相同字节流显示的内容与形式也不同:
2.1 字节流的显示输出由程序决定怎么解释。 通用的方式就是通过码表找对应的“字符”显示,常见的有ASCII码表。
(1)编码:字节转换成字符。 Reader读取字符,找码表。增强代码可读性,实际项目开发时也应该减少硬编码的使用多使用变量、枚举封装。
(2)解码:字符转换成字节。 InputStream读取字节找码表。 I/O操作的时候就是 编码与解码的过程。
(3)编码与解码要求规则一致,编码与解码的过程中使用同一个码表,找不到就乱码。
如: 16进制数0x70其本质就是一个01110000但是显示的方式有许多种。
2.2 乱码的原因:
(1)乱码俗称黑洞,将一切无法识别的字节用同一个字符表示因而无法识别的字节就丢失了。
(2)该程序的码表没有该字节码对应的字符。如:一个16进制文件使用2进制程序打开。 16进制四个字节读作一个字符,二进制是一个字节读作一个字符。用二进制的方式读取16进制文件肯定会出现一部分的乱码的。然而程序要正常运行文件肯定不能有乱码的。
2.3 程序常用16进制的原因:
(1)如:0x70(H) -----> 01110000(B),仔细比较的话可以看出16进制转2进制特别的简单,直接将每个16进制数转换成2进制数拼接即可。
(2)补充一个小知识:0x开头是16进制,8进制必须是0开头,十进制和二进制没有前缀约束。
2.4 Java File类的本质
File file =new File(“d:test.txt”) file并不是一个文件对象,而是 文件路径的封装,不确定可自行查看源码描述。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3InyC7hc-1583713932257)(https://s2.ax1x.com/2020/03/09/8Sm3vT.png)]
三、降低cpu与的运行速度与内存、硬盘不匹配问题:
前面提到过cpu的运行速度与内存、硬盘相比是很快的。
- 经典的IO模型:
优点:
易于理解,方便抽象。
缺点:
速度慢效率低。 一个一个的读取字节发送给cpu编码、解码、运算…。站在CPU的角度试想一下有一个人和你聊天说一个字停很久说一个字停很久而且你必须听他说完(因为字节流是连续的字节组成中间断开会造成很多问题,如:TCP协议)。
- 解决方式:
(1):BufferReader.readLine(); 将读取的字节存储在缓冲区中,直到缓存区满了或者读到文件末尾才将缓冲区的内容发送给CPU提高运行效率。
(2):并发(多线程)
(3)NIO(New Input Output):新的IO,以“块”传递数据,但是块与块之间无序。
四、不要重复造轮子
- 我们做之前要好好想一下这个需求、方法实现是否网上已经有了。其实大多数的方法实现都是有的,我们就没必要再发明造轮子了网上的肯定有比你写的好的代码。
- 推荐网站: Stack Overflow这是一个免费的IT程序员问答网站,很多问题都有解决方案且技术很前卫。