第二十一天内容 字节流复制,数组缓冲,缓冲区对象,字符流
1. 字节流进行文件复制
A. 字节输入流,读取数据源字节
FileInputStream 读取1个字节
B. 字节输出流,写入数据目的字节
FileOutputStream 写1个字节
2. FileInputStream读取文件
int read() 每次读取1个字节,返回int值
文件结尾返回-1
read()方法重载形式
A. int read(byte[] b)
方法中传递字节数组,流对象,将读取到的字节存储数组中
实现缓冲区作用,提高效率
int 返回值作用
数组里面存储的又是什么
InputStream类,读取字节数组方式
int fis.read(bytes) 返回每次读取,存储数组的有效个数
OutputStream类,写字节数组
void write(byte[] b, int off, int len)
写字节数组,从0开始,写几个,有效个数
3. IO中的缓冲流对象
读写数组,速度比读写单个字节快
JDK设计的时候,也考虑到效率问题,因此开发好了缓冲区流对象,
提高效率
A. BufferedOutputStream
字节输出流缓冲区对象,目的提高字节输出流的写入效率
BufferedOutputStream继承OutputStream
写的方法write,已经不需要学习了
构造方法:
BufferedOutputStream(OutputStream out)
传递的是OutputStream任意子类对象,可以传递任何字节输出流
为什么要传递字节输出流,BufferedOutputStream提高效率
提高谁的效率,构造方法中,传递的是谁,就提高谁
BufferedOutputStream(new FileOutputStream())
原理,自身有字节数组,我们写的数据,直接写在他的数组中
一次性写入文件中
B. BufferedInputStream
字节输入流对象,目的提高字节输入流的读取效率
BufferedInputStream继承InputStream
读取方法,不需要学习,读取单个字节,读取字节数组
构造方法:
BufferedInputStream(InputStream in)
传递的是InputStream任意子类对象,可以传递任意的字节输入流
传递的是谁,就对谁提高效率
new BufferedInputStream(new FileInputStream())
4. 字符编码
A. 编码表的由来
计算机电信号,变成数字信号,01
让算计机直接识别人类文件
美国,制定编码表,让人类的文字对应数字
97 字母 a
98 字母 b
47 数字 0
ASCII编码表: 数字,字母,符号
B. 简体中文编码表
数字对应汉字
两个数字,两个字节对应1个汉字,汉字采用负数表示
汉字两个字节,第一个字节肯定是负数,第二个字节可能是正数,可能是负数
出现第一张简体中文编码表 GB2312, Windows 95-98 Windows3.X
汉字存储量少,4000个汉字
编码扩容,汉字数量20000个, GBK 2000-10
Windows中文版系统,默认编码表都是GBK
再一次扩容, GB18030
C. Big5
大五码, 繁体中文编码表,香港,澳门,台湾
D. ISO8859-1编码表
拉丁文编码表
编码表中没有中文
JavaWeb,程序运行在互联网的世界
网络服务器软件, Apache Tomcat(拉丁文)
E. Unicode万国码
国际标准化组织,让一张码表融合全球所有语言
Unicode采用2个字节存储1个汉字,
Java中的char,就是Unicode
F. UTF-8编码表
万国码,汉字采用3个字节存储
中,GBK,UTF-8
开发中文版程序的困难
浏览器混乱:
IE FireFox Chrome Safari Opera
5. 字符串的编码和解码
A. 字符串的编码
将看的懂的,变成看不懂的
字符串转成字节数组
B. 字符串的解码
将看不懂,变成看的懂的
字节数组变成字符串
编码: String类方法getBytes()
解码: String类构造方法
6. 字符流
读写纯文本文件,中文也行
A. OutputStreamWriter 转换流
OutputStreamWriter 继承Writer
写的方法 write 字符,字符数组,字符数组一个部分,写字符串
作用: 字符流向字节的桥梁, 字符转成字节
构造方法:
OutputStreamWriter(OutputStream out)
传递任意的字节输出流
OutputStreamWriter流,将数据变成字节,写入传递的字节流中
new OutputStreamWriter(new FileOutputStream())
OutputStreamWriter(OutputStream out,String 编码表名)
发现现象: 字节流,还是字符流,写数据方法都是write
区别: 字节流写的是byte
字符流写的是char, String
B. InputStreamReader 转换流
InputStreamReader继承Reader
读取的方法read,读取单个字符,读取字符数组
作用: 字节流向字符的桥梁
构造方法:
InputStreamReader(InputStream in)
传递任意字节输入流,转换流从传递字节输入流中,读取数据
自己会进行自己的判断,如果是负数字节,让字节流再次读取
new InputStreamReader( new FileInputStream())
InputStreamReader(InputStream in,String 编码表名字)
7. 转换流的便捷类
A. OutputStreamWriter 类
子类 FileWriter, 继承OutputStreamWriter
FileWriter是OutputStreamWriter类便捷写法
前提: 操作的文件必须是操作系统中的默认编码表才可以
FileWriter 构造方法
FileWriter(File file)传递File对象,写入目的
FileWriter(String filename)传递字符串文件名
B. InputStreamReader 类
子类 FileReader,继承InputStreamReader
FileReader类是InputStreamReader类便捷写法
前提: 操作的文件必须是操作系统中的默认编码表才可以
构造方法
FileReader(File file)传递File对象,读取数据源
FileReader(String filename) 传递字符串文件名,读取数据源
读取方法:
read() 1个字符,
read(char[] c)字符数组 |
|