字符流虽然需要缓冲区进行处理,但是有一个问题千万不能够忽略,字符流能够输出字符串数据,所以有些时候就不得不进行字节流与字符流的操作转换(了解即可)
在java.io包里面提供有两个类:InputStreamReader,OutputStreamWriter.我们看看这两个类的定义和构造方法。
InputStreamReader
定义结构:public class InputStreamReader extends Reader
构造方法:public InputStreamReader(InputStrean in)
而InputStreamReader是Reader子类,通过构造函数将字节流变成了字符流
OutputStreamWriter
定义结构:public class OutputStreamWriter extends Writer
构造方法:public OutputStreamWriter(OutputStream out)
与上面同理。
范例:实现转换:
public static void main(String[] args) throws Exception{
//1.定义要输出的文件目录
File file=new File("e:"+File.separator+"demo"+File.separator+"my.txt");
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();//如果文件不存在,创建文件
}
OutputStream outputStream=new FileOutputStream(file);
//将outputstream类对象作为构造传入OutputStreamWriter,而后向上转型为Writer类对象
Writer out=new OutputStreamWriter(outputStream);
out.write("Hello World!");
out.flush();
out.close();
}
的确输出到了文件中Hello world!
之所采用这种方式转换,因为现在我们没有任何其它途径获得OutputStream类对象。所以此处是属于自己造了一个OutputStream。但是这种转换的意义不大,只有一种情况下有可能会用到这样的转换:方便处理中文数据。
观察:请观察类的继承结构
FileInputStream类的继承结构:
java.lang.Object
java.io.InputStream
java.io.FileInputStream
FileOutputStream类的继承结构:
java.lang.Object
java.io.OutputStream
java.io.FilterOutputStream
FileInputStream与OutputStream都是InputStream和OutputStream的直接子类。
接下来我们看看FileReader和FileWriter的继承结构:
FileReader:
java.lang.Object
java.io.Reader
java.io.InputStreamReader
java.io.FileReader
FileWriter:
java.lang.Object
java.io.Writer
java.io.OutputStreamWriter
java.io.FileWriter
这里出现了转换流,文件保存在磁盘上,磁盘上能够保存的文件形式都是以字节方式保存,而在使用字符流读取的时候,实际上也是对于字节数据进行读取,只不过这个转换过程被操作系统隐藏了,在缓冲区里面进行数据操作。
总结:
1.如果要进行转换,唯一可能出现的情况:处理中文
2.两个转换类都是字符流的子类,属于字符流与字节流的桥梁。
网友评论