

IO分两种流:
字节流 InputStream OutputStream
字符流 Reader Writer
他们都是抽象类
具体实现 : 字节流 FileInputStream FileOutputStream 字符流 FileReader FileWriter
字节流转换成字符流可以用 InputSteamReader OutputStreamWriter
转换流的特点:
- 其是字符流和字节流之间的桥梁
- 可对读取到的字节数据经过指定编码转换成字符
- 可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
- 当字节和字符之间有转换动作时;
- 流操作的数据需要编码或解码时。
具体的对象体现:
- InputStreamReader:字节到字符的桥梁
- OutputStreamWriter:字符到字节的桥梁
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。
转换成BufferdReader BufferedWriter 他们具有缓冲区
比如:
new BufferedReader(new InputStreamReader(client.getInputStream()));
解释:
client.getInputStream()是字节流;
InputStreamReader把字节流转换成字符流;
BufferedReader缓冲字符流,使得能够使用readline()等方法,直接读取一行。
例如:读取文件 从字节流输入到字符流输入
FileInputStream fileInputStream = new FileInputStream("d:/text.txt"); // 定义一个指向D:/TEXT.TXT 的字节流
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
//字节流转换成InputStreamReader
BufferedReader bufferedReader = new BufferedReader(inputSteamReader);
//InputStreamReader 转换成带缓存的bufferedReader
//可以把读出来的内容赋值给字符
String ss = new String();
String s;
while((s = bufferedReader.readLine())!=null){
ss += s;
}
例如:写入文件 从字节流输出到字符流输出
FileOutputStream fileOutputStream = new FileOutputStream("d:/text.txt"); //定义一个指向D:/TEXT.TXT文件字节流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
//输出字节流装换为字符流
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
//输出字符流转换为缓冲流
bufferedWriter.write(s);
bufferedWriter.close();//关闭缓冲字符流
outputStreamWriter.close();//关闭输出字符流
fileOutputStream.close();//关闭字节流
补充:
对于我们常用的GBK中,英文是占用1个字节,中文是2个 对于UTF-8,英文是1个,中文是3个 对于Unicode,英文中文都是2个
java中char占用两个字节,而byte占用一个字节。
一句话概括:字节流是由字节组成的,字符流是由字符组成的.Java里字符由两个字节组成.
扩展:字节流是最基本的,字符流是为了处理字符而提出来的。所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化
补充:实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
|