欢迎光临散文网 会员登陆 & 注册

java转换流

2022-08-21 12:50 作者:虚云幻仙  | 我要投稿

/**
* 转换流InputStreamReader/OutputStreamWriter
*/

public class ConvertStream1 {
   public static void main(String[] args) {
       try (
               InputStream in = System.in;
                //System.in是InputStream对象,用于读取键盘输入/数据源的字节,是字节流、节点流,每次.read()只能读取一个字节,当用Scanner(System.in)的nextLine()方法时会将字节流转换为字符流(使用字符集进行解码),再通过BufferedReader读取整行内容
                OutputStream out = System.out;
                //System.out是PrintStream对象,PrintStream继承FilterOutputStream继承OutputStream,用于显示接收到的内容,是字节流、节点流,System.out.println()方法同样将out字节流外套转换流再外套缓冲流,通过BufferedWriter输出整行内容(字符数组),通过OutputStream将字符数组转换为字节数组(使用字符集进行编码),通过out将字节数组输出
                InputStreamReader isr = new InputStreamReader(in);
                //InputStreamReader处理字节流,实现字节流向字符流的转换,是处理流、字符流,构造器第二个参数用于设定字符集,不填默认使用utf-8字符集,将读取到的字节转换为字符的过程是解码的过程,按照字符集的规则将不同长度的字节bytes转换为2字节的char字符(unicode字符集每个字符占2byte),字节本身只是01二进制数,需要使用和编码相同的字符集解码才能正确的还原字符
                OutputStreamWriter osw = new OutputStreamWriter(out);
                //OutputStreamWriter将字节输出流转换为字符输出流,构造器第二个参数用于设定字符集,不填默认使用utf-8字符集,将字符按照字符集的规则转换为不同长度的字节bytes,再通过out将bytes输出,对于输出的内容/二进制数只有用相同的字符集解码才能还原成正确的字符

               BufferedReader br = new BufferedReader(isr);

               //将转换流传给字符缓冲流
               BufferedWriter bw = new BufferedWriter(osw)
       ){
           String inp;
           do {
               bw.write("请输入:");
               bw.flush();
               inp = br.readLine();
               //.readLine()是读取一行内容,当System.in等待用户输入完成字符串后.read()只能读取一个字节的内容,通过嵌套处理流调用.readLine()将一行内容全部读取
               bw.write("请确认您输入的内容是否正确:" + inp);
               //使用字符处理流.write()
               bw.newLine();
               bw.write("确认Y/N:");
               bw.flush();
               //flush()在每一段输出的末尾使用,不需要每输出一次执行一遍
               inp = br.readLine();
           } while (!"y".equalsIgnoreCase(inp));
       }catch (Exception e){
           e.printStackTrace();
       }
       //System.out可以输出字节到控制台,当BufferedWriter写入字符串String时将字符串变为字符数组char[],后续执行flush时,调用内置的OutputStreamWriter,通过流编码器将字符数组char[]根据设定的字符集charset转化为字节数组byte[],这个过程是编码的过程
       //System.out将编码后的字节数组byte[]输出到控制台,控制台再对bytes进行解码,转化为字符串/文本显示出来



       try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("iostream/testFile4.txt")));
           BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("iostream/testFile5.txt")))){
           //字节流外面套转换流再套缓冲流
           int num = 1;
           for (String line = br.readLine();line!=null;line = br.readLine()){
               bw.write(num+".\t"+line);
               //字节流无法使用拼接字符串添加行号,通过嵌套后使用缓冲流的write,作用同BufferedWriter(FileWriter)的write,而FileWriter对象内部也会生成OutputStreamWriter(FileOutputStream)对象
               bw.newLine();
               num++;
           }
           bw.flush();
       }catch (Exception e){
           e.printStackTrace();
       }

   }
}

java转换流的评论 (共 条)

分享到微博请遵守国家法律