• Java字节流&字符流的转换


    我的需求是这样的:

    读取JSON文件,转化为字符串,然后在解析为POJO

    我是这样思考的:

    以指定编码以字节流方式读取为字符流,读取为字符串。

    1.具体的类

    •     InputStreamReader 是字节流通向字符流的桥梁
      •        BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
    •     OutputStreamWriter 是字符流通向字节流的桥梁
      •       Writer out  = new BufferedWriter(new OutputStreamWriter(System.out));

    JDA APiI的描述:

     

    InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

    每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

    为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:

     BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    

     

    OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

    每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

    为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:

     Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
     

    代理对 是一个字符,它由两个 char 值序列表示: 代理项的范围为 'uD800' 到 'uDBFF',后跟范围为 'uDC00' 到 'uDFFF' 的 代理项。

    错误代理元素 指的是后面不跟低代理项的高代理项,或前面没有高代理项的低代理项。

    此类总是使用字符集的默认替代序列 替代错误代理元素和不可映射的字符序列。如果需要更多地控制编码过程,则应该使用 CharsetEncoder 类。 

    /**
    * @return java.lang.String
    * @Author Liruilong
    * @Description 文件转字符串
    * @Date 17:22 2020/3/17
    * @Param [file]
    **/

    public static String readJsonToString(File file) {
    String string = null;
    if (!file.exists() || file.isDirectory()) {
    System.out.println("输入路径不对");
    } else {
    try {
    string = fileToBufferedReader((bufferedReader) -> {
    String str = null;
    StringBuilder stringBuilder = new StringBuilder();
    while ((str = bufferedReader.readLine()) != null) {
    stringBuilder.append(str);
    }
    return stringBuilder.toString();
    }, file);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return string;
    }

    /**
    * @return java.lang.String
    * @Author Liruilong
    * @Description 环绕处理
    * @Date 17:14 2020/3/17
    * @Param [inputStreamPeocess, file]
    **/

    public static String fileToBufferedReader(InputStreamPeocess inputStreamPeocess, File file) throws IOException {
    try (FileInputStream fileInputStream = new FileInputStream(file)) {
    try (InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream)) {
    try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
    return inputStreamPeocess.peocess(bufferedReader);
    }
    }
    }
    }
    package com.liruilong.demotext.service.utils.interfaceutils;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    
    /**
     * @Description : 函数接口,描述BufferedReader ->String的转化方式
     * @Author: Liruilong
     * @Date: 2020/3/17 15:44
     */
    @FunctionalInterface
    public interface InputStreamPeocess {
        /**
         * @Author Liruilong
         * @Description 方法签名 BufferedReader ->String
         * @Date 15:47 2020/3/17
         * @Param [inputStream]
         * @return com.liruilong.demotext.service.utils.InputStream
         **/
    
        String peocess(BufferedReader bufferedReader) throws IOException;
    }

  • 相关阅读:
    media query 开发总结
    整屏滚动
    移动端reset样式
    中国天气网 城市代码 sql语句
    php文章tag标签的增删
    oracle的分号和斜杠/
    php 操作 oracle lob 数据2
    php 操作 oracle lob 数据
    oracle创建用户
    php进度条
  • 原文地址:https://www.cnblogs.com/liruilong/p/12500143.html
Copyright © 2020-2023  润新知