1、从计算机的存储说起
电脑电脑,有电才能发挥出“脑”的作用,没电就是破铜烂铁一堆,根据电的特性(高低电平)巧妙的使用0、1组合,记住了万事万物,才得以让"破铜烂铁"发挥出神奇的功效。 所以计算机最底层就是0、1(二进制)也称为比特位(bit)。计算机在处理数据的时候不是按照单个0、1进行处理的(处理起来太慢并且单个比特位表示的信息范围有限),因此在处理数据的时候采用处理一组比特位,也称为字节(B/byte),1B = 8bit。
所有的字符又由字节组成,根据不同的编码规则,同一个字符可能使用不同数量的字节表示。
综上所述:虽然计算机最底层使用的是比特位存储信息,但是计算机在处理数据都是以字节为单位进行处理,所以可以认为“字节的不同组合”能表示一切信息。
2、I、O
何为I/O ?
I: input 输入
O: output :输出
这个输入、输出是相对谁而言 ?
如:小明借了小华100元,小华又借了小方50元。那么可以说,相对小明,小华是出借人,小明是借款人。相对小方小华是借款人,所以总要有个"参考物")
所谓输入和输出是针对内存而言,进入内存:输入;从内存出去:输出。
3、I/O具体分类
字节是给计算机看的(计算机操作都以字节为单位);字符是给人看的。
因此将I/O分为两类:字节流和字符流。再相对内存而言,又具体分为字节输入流和字节输出流;字符输入流和字符输出流。
4、java中IO相关类
InputStream: 字节输入流的超类:
常见方法汇总:
方法名称 | 说明 |
---|---|
read() | 返回当前读取的字节值(0-255) ,没有返回-1(为何是0~255 java中byte占用1字节) |
read(byte b[]) | 同上 |
read(byte b[], int off, int len) | 同上 |
mark(int readlimit) | 标记位置(比较抽象,看具体实现) |
reset() | 退回到标记位置,与变量mark有关 |
skip(long n) | 跳过n个字节 |
close() | 关闭流、释放资源 |
InputStream: 字节输出流的超类:
常见方法汇总:
方法名称 | 说明 |
---|---|
write(int b)) | 写出单个字节 |
write(byte b[]) | 写出字节数组 |
write(byte b[], int off, int len) | 写出字节数组中的某些部分,自定义开始位置,写出长度 |
flush() | 强制写出任何缓存的字节数据 |
close() | 关闭流、释放资源 |
Reader: 字符输入流的超类:
常见方法汇总:
方法名称 | 说明 |
---|---|
read() | 读取单个字符,字符集编码中最长使用4字节表示一个字符, 所以返回值介于0x00-0xffff;使用int接收即可 |
read(char cbuf[]) | |
read(char cbuf[], int off, int len) | |
mark(int readAheadLimit) | 指定位置做标记 |
reset() | 退回到标记位 |
skip(long n) | 读取时跳过n个字符 |
close() | 关闭流、释放资源 |
Writer:字符输出流的超类:
常见方法汇总:
方法名称 | 说明 |
---|---|
write(int c) | 写出单个字符 |
write(String str) | 写出字符串 |
write(String str, int off, int len) | ~ |
write(char cbuf[]) | ~ |
write(char cbuf[], int off, int len) | ~ |
close() | ~ |
flush() | ~ |
append(char c) | 追加指定的字符 |
append(CharSequence csq) | ~ |
append(CharSequence csq, int start, int end) | ~ |