IO分两种流:
字节流 InputStream OutputStream
字符流 Reader Writer
他们都是抽象类
具体实现 :
字节流 FileInputStream FileOutputStream
字符流 FileReader FileWriter
字节流转换成字符流可以用 InputSteamReader 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来处理,也就是要进行字符集的转化
补充:实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。