对于JAVA I/O来说,I意味着Input(输入),O意味着Output(输出) 。读书写作并非易事,而创建一个好的I/O系统更是一项艰难的任务 。
古人云:“读书破万卷,下笔如有神” 。也就是说,只有大量的阅读,写作的时候才能风生水起——写作意味着输出(我的知识传播给他人),而读书意味着输入(从他人的知识中汲取营养) 。
01、数据流之字节与字符
Java所有的I/O机制都是基于 数据流 进行的输入输出 。数据流可分为两种:
1)字节流,未经加工的原始二进制数据,最小的数据单元是 字节 。
2)字符流,经过一定编码处理后符合某种格式规定的数据,最小的数据单元是 字符 ——占用两个字节 。
OutputStream 和 InputStream 用来处理字节流; Writer 和 Reader 用来处理字符流; OutputStreamWriter 可以把 OutputStream 转换为 Writer ,InputStreamReader 可以把 InputStream 转换为 Reader。
Java的设计者为此设计了众多的类,见下图 。
文章插图
看到这么多类,你一定感觉头晕目眩 。反正我已经看得不耐烦了 。搞这么多类,看起来头真的大——这也从侧面说明实际的应用场景各有各的不同——你也完全不用担心,因为实际项目当中,根本就不可能全用到(我就没用过 SequenceOutputStream ) 。
我建议你在 学习的时候要掌握一种“挑三拣四”的能力 ——学习自己感兴趣的、必须掌握的、对能力有所提升的知识 。切不可囫囵吞枣,强迫自己什么都学 。什么都学,最后的结果可能是什么都不会 。
字符流是基于字节流的,因此,我们先来学习一下字节流的两个最基础的类—— OutputStream 和 InputStream ,它们是必须要掌握的 。
1)OutputStream
OutputStream 提供了4个非常有用的方法,如下 。
其子类 ByteArrayOutputStream 和 BufferedOuputStream 最为常用(File相关类放在下个小节) 。
①、 ByteArrayOutputStream 通常用于在内存中创建一个字节数组缓冲区,数据被“临时”放在此缓冲区中,并不会输出到文件或者网络套接字中——就好像一个中转站,负责把输入流中的数据读入到内存缓冲区中,你可以调用它的 toByteArray() 方法来获取字节数组 。
来看下例 。
ByteArrayOutputStream 的责任就是把 InputStream 中的字节流“一字不差”的读出来——这个工具方法很重要,很重要,很重要——可以解决粘包的问题 。
②、 BufferedOuputStream 实现了一个缓冲输出流,可以将很多小的数据缓存为一个大块的数据,然后一次性地输出到文件或者网络套接字中——这里的“缓冲”和 ByteArrayOutputStream 的“缓冲”有着很大的不同——前者是为了下一次的一次性输出,后者就是单纯的为了缓冲,不存在输出 。
来看下例 。
使用 BufferedOuputStream 的时候,一定要记得调用 flush() 方法将数据从缓冲区中全部输出 。使用完毕后,调用 close() 方法关闭输出流,释放与流相关的系统资源 。
2)InputStream
InputStream 也提供了4个非常有用的方法,如下 。
其子类 BufferedInputStream (缓冲输入流)最为常用,效率最高(当我们不确定读入的是大数据还是小数据) 。
无缓冲流上的每个读取请求通常会导致对操作系统的调用以读取所请求的字节数——进行系统调用的开销非常大 。但缓冲输入流就不一样了,它通过对内部缓冲区执行(例如)高达8k字节的大量读取,然后针对缓冲区的大小再分配字节来减少系统调用的开销——性能会提高很多 。
使用示例如下 。
先来看一个辅助方法 byteToInt ,把字节转换成int 。
再来看如何从输入流中,根据指定的长度contentLength来读取数据 。readBytes() 方法在之前已经提到过 。
我敢保证,只要你搞懂了字节流,字符流也就不在话下——所以,我们在此略过字符流 。
02、File类
前面我们了解到,数据有两种格式:字节与字符 。那么这些数据从哪里来,又存往何处呢?
一个主要的方式就是从物理磁盘上进行读取和存储,磁盘的唯一最小描述就是文件 。也就是说上层应用程序只能通过文件来操作磁盘上的数据,文件也是操作系统和磁盘驱动器交互的一个最小单元 。
在Java中,通常用 File 类来操作文件 。当然了,File不止是文件,它也是文件夹(目录) 。File类保存了文件或目录的各种元数据信息(文件名、文件长度、最后修改时间、是否可读、当前文件的路径名等等) 。
推荐阅读
- IDE 一篇文章带你明白:什么是编译器,什么是集成开发环境?
- 深入理解Java继承的实现原理
- 都说4S店套路多 看完这篇秘笈安心提新车
- 笔记本|入门性能可战GTX 1650!用户买不到 Intel Arc显卡本着急了:官方回应
- Java-背包算法实现
- JavaScript 中的位运算和权限设计
- mysql数据库基本增删改查操作总结
- JAVA中ArrayList、LinkedList、Vector、Stack的比较
- 15个入门基础护肤法则,护肤小白赶紧拿去收藏
- 教育教学读书心得体会3篇 读书活动心得体会