zoukankan      html  css  js  c++  java
  • java IO(五):字节流、字符流的选择规律

    字节流、字符流涉及的类比较多,比较容易混淆。因此,有必要针对何时使用字节流、何时使用字符流、何时使用Buffer类的流做一个归纳。要归纳它们,无需过多的语言,只需抓住它们的重点和特性即可。

    在决定何时使用何种类时,以下几个问题需要考虑清楚。

    1. 是否有数据源、数据的流向是否有目标。
      • 数据源:表示输入,或称为读。可提供使用的两个父类为InputStream和Reader。
      • 有目标:表示输出,或称为写。可提供使用的两个父类为OutputStream和Writer。
    2. 应该使用字节流还是字符流?如果源或目标包含非ascii字符,则采用字符流。
    3. 源和目标是何种设备类型。
      • 源 :磁盘文件File,内存(字节/字符数组),键盘System.in,网络socket
      • 目标:磁盘文件File,内存(字节/字符数组),屏幕System.out,网络socket
    4. 是否需要使用额外的特殊功能,包括操作行,字符集转换,使用缓冲区提高效率,串联多个字节输入流,保证数据类型不变,保证数据字面意义等等。最后还需要考虑字节流转换为字符流的问题。

    最后,需要知道的是对于使用BufferedReader的输入流,有时候可以考虑使用字符数组可能效果和性能更好。

    以下是一个应用以上规律的需求示例:读取包含gbk简体中文的文件数据,并以utf-8编码复制到另一个文件中。

    //1.有源有目标,且都是文件。

    //2.读取和写入都包含中文字符,所以采用字符流。

    //3.写入过程中需要转码,因此需要使用OutputStreamWriter。

    //4.可以使用缓冲区功能提高效率。

    import java.io.*;
    
    
    public class CP {
        public static void main(String[] args) throws IOException {
            File src = new File("d:/myjava/a.txt");
            File dest = new File("d:/myjava/a_bak.txt");
            cp(src,dest);
        }
    
        public static void cp(File src,File dest) throws IOException {
            BufferedReader bufr = new BufferedReader(new FileReader(src));
            BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf-8"));
    
            //按行读取
    
            String line = null;
            while((line=bufr.readLine())!=null) {
                bufw.write(line);
                bufw.newLine();
                bufw.flush();
            }
            bufw.close();
        }
    }
    

    上述代码执行后,目标文件中的末尾将比源文件多一个空行,上述方法对这个问题不是很好解决。但如果使用字符数组来替代BufferedReader,则没有这样的问题,如下。

    import java.io.*;
    
    
    public class CP {
        public static void main(String[] args) throws IOException {
            File src = new File("d:/myjava/a.txt");
            File dest = new File("d:/myjava/a_bak.txt");
            cp(src,dest);
        }
    
        public static void cp(File src,File dest) throws IOException {
        FileReader fr = new FileReader(src);
        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf-8"));
    
        char[] buf = new char[1024];
        int len = 0;
        while ((len=fr.read(buf))!=-1) {
            bufw.write(buf,0,len);
            bufw.flush();
        }
        bufw.close();
        }
    }
    

    注:若您觉得这篇文章还不错请点击右下角推荐,您的支持能激发作者更大的写作热情,非常感谢!

  • 相关阅读:
    给<label>点击事件时, 竟然点击了两次
    使用label失效的原因
    vue的又开启
    git使用切换分支等
    【转】 IOS,objective_C中用@interface和 @property 方式声明变量的区别
    【转】iOS-Core-Animation-Advanced-Techniques(六)
    【转】iOS-Core-Animation-Advanced-Techniques(五)
    【转】iOS-Core-Animation-Advanced-Techniques(四)
    【转】iOS-Core-Animation-Advanced-Techniques(三)
    【转】iOS-Core-Animation-Advanced-Techniques(二)
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/8159282.html
Copyright © 2011-2022 走看看