动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

浅析IO转换流

05-24 17:19 896浏览
举报 T字号
  • 大字
  • 中字
  • 小字

我们在学习字符流(FileReader、FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢?这其中就涉及到了IO转换流的相关知识。

为了方便我们的理解可以先来看一下转换流原理图:

通过上面的原理图,我们发现IO转换流提供了在字节流和字符流之间的转换,且字节流中的数据都是字符时,转成字符流操作更高效。Java API提供了两个转换流:

InputstreamReader:将Inputstream转换为Reader。

OutputStreamWriter:将Writer转换为OutputStream。

1.InputStreamReader

InputStreamReader将一个字节的输入流转换为字符的输入流,解码:字节、字节数组 --->字符数组、字符串。

构造器:

  • public InputStreamReader(InputStream in)
  • public InputStreamReader(Inputstream in,String charsetName):可以指定编码集。

2.OutputStreamWriter

OutputStreamWriter将一个字符的输出流转换为字节的输出流,编码:字符数组、字符串 ---> 字节、字节数组。

构造器:

  • public OutputStreamWriter(OutputStream out)
  • public OutputStreamWriter(Outputstream out,String charsetName):可以指定编码集。

代码示例:

 /**
 综合使用InputStreamReader和OutputStreamWriter
      */
 public class IsrAndOswTest {
 ​
     @Test
     public void test() {
 ​
         InputStreamReader isr = null;
         OutputStreamWriter osw = null;
         try {
             //1.造文件、造流
             File file1 = new File("D:\\io\\hello.txt");
             File file2 = new File("D:\\io\\hello_gbk.txt");
 ​
             FileInputStream fis = new FileInputStream(file1);
             FileOutputStream fos = new FileOutputStream(file2);
 ​
             isr = new InputStreamReader(fis, "utf-8");
             osw = new OutputStreamWriter(fos, "gbk"); 
             //2.读写过程
             char[] cbuf = new char[1024];
             int len;
             while ((len = isr.read(cbuf)) != -1) {
                 osw.write(cbuf, 0, len);
             }
         } catch (IOException e) {
             e.printStackTrace();
         } finally {
             // 3.关闭资源
             if (isr != null) {
                 try {
                     isr.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
             if (osw != null) {
                 try {
                     osw.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
     }
 }

通俗一点来说,磁盘中的存储的数据都是“看不懂”的,也就是以字节形式存储的。而内存中存储的数据都是“看得懂”的,也就是以字符形式存储的。把“看得懂”的数据转换成"看不懂"的数据,即把字符流编码成字节流。怎么样,是不是觉得IO转换流十分神奇呢,在动力节点在线的免费视频课程中,我们将对IO转换流一探究竟。

0人推荐
共同学习,写下你的评论
0条评论
代码小兵652
程序员代码小兵652

113篇文章贡献392215字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消