3.3、转换流(了解,千万别会)
现在对于IO操作就存在了字节流和字符流两种操作流,那么对于这两种操作流之间也是可以进行转换的,而转换的操作类有两个:
· 将字节输出流变为字符输出流(OutputStream è Writer):OutputStreamWriter;
· 将字节输入流变为字符输入流(InputStream è Reader):InputStreamReader。
以上两个类的定义结构和构造方法如下:
OutputStreamWriter: |
InputStreamReader: |
public class OutputStreamWriter extends Writer |
public class InputStreamReader extends Reader |
public OutputStreamWriter(OutputStream out) |
public InputStreamReader(InputStream in) |
通过以上的继承结构和构造方法可以清楚的发现,既然OutputStreamWriter是Wirter的子类,那么必然OutputStreamWriter可以通过Wirter类执行对象的向上转进行接收,而同时这个OutputStreamWriter类的构造方法可以接收OutputStream,这样就可以完成转换。
范例:将字节输出流变为字符输出流
package cn.mldn.demo; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; public class TestDemo { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "hellodemo" + File.separator + "test.txt"); // 定义文件路径 if (!file.getParentFile().exists()) { file.getParentFile().mkdirs();// 创建父目录 } OutputStream output = new FileOutputStream(file) ; // 字节输出流 Writer out = new OutputStreamWriter(output) ; out.write("Hello World .") ; out.close() ; } } |
范例:将字节输入流变为字符输入流
package cn.mldn.demo; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; public class TestDemo { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "hellodemo" + File.separator + "test.txt"); // 定义文件路径 if (file.exists()) { // 文件存在则可以读取 InputStream input = new FileInputStream(file) ; Reader in = new InputStreamReader(input) ; // 将字节输入流变为字符输入流 char data[] = new char[1024]; // 假设要读的长度是1024 int len = in.read(data) ; // 读取数据,返回读取个数 input.close() ; // 关闭 in.close() ; System.out.println("读取的数据是:【" + new String(data, 0, len) + "】"); } } } |
本代码在实际工作的时候出现的几率不会超过1%设置更低。讲解这个类的目的主要是希望通过这个类来观察一下之前文件字符流和文件字节流的定义区别。
对于文件操作可以使用FileInputStream、FileOutputStream、FileReader、FileWriter四个类,那么下面分别观察这四个类的继承结构。
第一组:观察FileInputStream、FileOutputStream类的继承结构
FileInputStream: |
FileOutputStream: |
java.lang.Object |- java.io.InputStream |- java.io.FileInputStream |
java.lang.Object |- java.io.OutputStream |- java.io.FileOutputStream |
第二组:观察FileReader、FileWriter类的继承结构
FileReader: |
FileWriter: |
java.lang.Object |- java.io.Reader |- java.io.InputStreamReader |- java.io.FileReader |
java.lang.Object |- java.io.Writer |- java.io.OutputStreamWriter |- java.io.FileWriter |
通过以上的继承关系也可以发现,实际上所有的字符数据都是需要进行转换的,依靠转换流完成,以后真正保存或者是传输的数据是不可能有字符的,全部都是字节,而字符只是在电脑之中处理后的结果。