字符流相关
字符流基本上可以类比字节流 只不过是将字节流的byte 换为char。
最根本的两个类是Reader以及Writer
Reader的子类有:
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
Writer的子类有:
BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
特殊的类:
InputStreamReader以及OutputStreamWriter 通过这两个类可以实现字节流与字符流之间的转化,前提是本身读入的是字符串。
将字节流转化为字符流
public InputStreamReader(InputStream in)
利用指定的编码格式cs 将字节流转化为字符流
InputStreamReader(InputStream in, Charset cs)
OutputStreamWriter的使用也是类似的方式
例子:
package com.characterStream.bufferWriter;
import java.io.*;
public class streamTest {
public static void main(String[] args) throws Exception {
FileOutputStream fos=new FileOutputStream("F:\filetest.txt");
//这里将字节流转化为字符流
OutputStreamWriter osw=new OutputStreamWriter(fos);
//这里是字节流的过滤流
BufferedWriter bw=new BufferedWriter(osw);
bw.write("the test of BufferedStream");
bw.write(' ');
bw.write("test is finished");
//用字符流的时候这里的close就变得更加关键了
//只有close的时候 才会将bufferedwriter中的内容写入到文件中
//否则的话 文件中是没有什么实际内容的
bw.close();
//再通过字符流从外部读入
FileReader fr=new FileReader("F:\filetest.txt");
BufferedReader br=new BufferedReader(fr);
//这个是每次读入一行数据
String str;
while((str=br.readLine())!=null){
System.out.println(str);
}
br.close();
//将标准输入设备包装成为字节流 每次在控制体上输入的信息又会再次打印出来
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader bfr=new BufferedReader(isr);
//注意这种输入流的通用的格式 读到最后一行的话 就会出来一个 null 表示已经//到了最后一行
while((str=bfr.readLine())!=null){
System.out.println(str);
}
bfr.close();
}
}
注意字符流中由于缓冲区的使用,只有在close的时候才会将字符流中的内容读进来或者读出去,加上close是非常关键的。
关于包装模式在IO中的应用
之前也看到了具体的IO过滤流的一些典型的写法 比如:
DataOutputStream dos=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("F:\filetest.txt")));
但是为什么能这样写,就是说为什么能写成这么一种嵌套的模式,这就要涉及到Java的设计模式,这里面应用到的就是包装模式具体见: