JavaSE 流式读取文件数据

举报
RupertTears 发表于 2021/07/29 22:35:19 2021/07/29
【摘要】 给定一个文本文件,用java代码进行流式读取数据,输出至控制台。

经典习题:给定一个文本文件,用java代码进行流式读取数据,输出至控制台。

小发现:out和err同时使用会乱序,原因是out输出是带有缓存的,所以err会先被控制台打印出来。

核心业务代码:

package com.miracle.tears.detail;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/** 流式读取文件 进行分组 */
public class StreamGroup {

  public static void main(String[] args) throws IOException {
    // 1. 定义文件路径
    String filePath = "src/main/resources/StreamGroupFile.txt";
    // 2. 创建文件输入流,读取文件(字节流)
    FileInputStream fis = new FileInputStream(filePath);
    // 3. 转换为字符流,设置编码
    InputStreamReader isr = new InputStreamReader(fis);
    // 4. 缓冲流提升效率
    BufferedReader br = new BufferedReader(isr);

    // 流式分组开始

    // 5.  定义所需要的参数
    // 5.1 当前的key
    String currentKey = null;
    // 5.2 当前的value
    String currentValue = null;
    // 5.3 前一个key
    String previousKey = null;
    // 5.4 前一个value
    String previousValue = null;

    // 6. 定义装载结果的集合
    List<String> groupList = new ArrayList<>();
    // 7. 定义读取到的内容,作为循环判断的条件
    String tempLine;

    // 8. 循环读取
    while ((tempLine = br.readLine()) != null ){
      // 8.1 获取当前行,以空格隔开
      String [] kvArray = tempLine.split("\\s");
      // 8.2 设置当前的key 和 value
      currentKey = kvArray[0];
      currentValue = kvArray[1];

      // 9. 边界问题(上边界和下边界)
      // 9.1 上边界
      if (previousKey == null){
        // 9.1.1 此时代表的处理的所有数据的 第一行数据
        groupList.add(tempLine);
        // 9.1.2 更新 previousKey 的变化
        previousKey = currentKey;
      }else if (currentKey.equals(previousKey)){
        // 9.2 同一个key 即代表同组,直接追加
        groupList.add(tempLine);
      }else {
        // 9.3 不是同一个key 说明不同组,输出上一组,构建新组
        // 9.3.1 流式读取完毕一组,输出
        System.out.println("=====流式读取开始=====");
        for (String line : groupList){
          System.out.println("当前为流式读取同组:"+line);
        }
        /**
         * 如果测试用 err 打印,会乱序输出。
         * 原因是out是带有缓存的,而err没有。
         */
        System.out.println("=====流式读取结束=====");
        // 9.3.2 更新key
        previousKey = currentKey;
        // 10. 清空集合
        groupList.clear();
        // 11. 添加当前读取的数据
        groupList.add(tempLine);
      }
    }

    // 12. 下边界
    for (String line : groupList) {
      System.out.println("最后一组:"+line);
    }

    // 13. 关闭资源
    br.close();
    isr.close();
    fis.close();
  }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。