JAVA_IO简记

JAVA_IO简记_第1张图片

JAVA_IO简记_第2张图片

IO分两种流:

字节流 InputStream OutputStream

字符流 Reader Writer

他们都是抽象类


具体实现 :
字节流 FileInputStream FileOutputStream
字符流 FileReader FileWriter


字节流转换成字符流可以用 InputSteamReader OutputStreamWriter

转换流的特点:

  1. 其是字符流和字节流之间的桥梁
  2. 可对读取到的字节数据经过指定编码转换成字符
  3. 可对读取到的字符数据经过指定编码转换成字节

何时使用转换流?

  1. 当字节和字符之间有转换动作时;
  2. 流操作的数据需要编码或解码时。

具体的对象体现:

  1. InputStreamReader:字节到字符的桥梁
  2. 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来处理,也就是要进行字符集的转化

补充:实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。



你可能感兴趣的:(java)