基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件

  • 致谢
  • 1 为什么要使用流式输入输出(使用情景)
  • 2 目标、主要思路及相关方法
    • 2.1 目标
    • 2.2 思路
    • 2.3 相关方法
      • 2.3.1 读入相关
      • 2.3.2 输出相关
  • 3 示例
    • 3.1 环境
    • 3.2 测试数据
    • 3.3 测试代码 - Java
    • 3.4 测试结果
    • 3.5 注意事项

致谢

DOSKEY_jason

参考文章

奇伢 - 使用流的方式读写JSON(GSON)

1 为什么要使用流式输入输出(使用情景)

解决 在进行非流式输入输出时,当需处理的文件 过大 时(比如上G的数据文件),无法将整个完整的文件放入内存,导致堆栈溢出,GC溢出等情况。

2 目标、主要思路及相关方法

2.1 目标

将大型asc文件的数据解析后,转换成JSON文件

2.2 思路

对读入的asc文件每次提取一部分内容,解析后,调用GSON库生成相应的一部分JSON文件并写出。

2.3 相关方法

2.3.1 读入相关

使用的主要java相关读入类

  • BufferedReader

其相关方法

  • bufferedReader.readLine() - - 按行读取

2.3.2 输出相关

使用的主要GSON类

  • JsonWriter

其相关方法

  • new JsonWriter(new FileWriter(xxx)) - - 构造方法
  • writer.beginObject() - - 开始写JSON文件 相当于写JSON文件的 { 对象开始符号
  • writer.endObject() - - 结束JSON文件 相当于写JSON文件的 } 对象结束符号
  • writer.name(xxx) - - 写入一个键名为xxx的键
  • writer.value(yyy) - - 写入一个值为yyy的值
  • writer.name(xxx).value(yyy) - - 写入一个键为xxx,值为yyy的键值对
  • writer.beginArray() - - 开始一个数组 相当于写JSON文件的 [ 符号
  • writer.endArray() - - 结束一个数组 相当于写JSON文件的 ] 符号
  • writer.close() 关闭输出器

相关方法输出解析示例

3 示例

3.1 环境

GSON库的maven依赖

     <!--GSON依赖--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version></dependency>

3.2 测试数据

读入的asc文件

文件的类似基本结构(按行排列,不定量的空格做单个数据分隔)
读入的asc文件的结构 关系到 其相应 提取数据的策略

3.3 测试代码 - Java

main()入口方法

//        输入设置String fileName = "zhemindem_30.asc";String filePath = "C:\\dataTest\\asc\\";String bigFile = filePath + fileName;//        输出设置String outFileParent2 = "E:\\json\\";String outputFile2 = outFileParent2 + fileName.replaceAll(".asc", ".json");String encoding2 = "utf-8";//        转换方法convertBigFile(bigFile, outputFile2, encoding2);

具体转换方法 - convertBigFile()

    public static void convertBigFile(String inputFile, String outputFile, String encoding){//        将文件名作为主体数据部分的键名String dataKey = inputFile.substring(inputFile.lastIndexOf("\\")+1).split(".asc")[0];File file = new File(inputFile);FileReader fileReader = null;BufferedReader bufferedReader = null;JsonWriter writer;String temp;int count = 0;
//        asc文件总行数int nrows = 0;
//        asc文件总列数int ncols = 0;try {fileReader = new FileReader(file);
//            读入器bufferedReader = new BufferedReader(fileReader);
//            写出器writer = new JsonWriter(new FileWriter(outputFile));//开始准备生成JSON文件writer.beginObject(); // {while((temp = bufferedReader.readLine())!=null){System.err.println("currentRow: " + count);
//                解析当前行,前6行 为属性,后面行 为数据String[] result = temp.split(" +");if (count == 0 ) {System.out.println(count + " : " + temp);
//                    result[0]属性名,result[1]属性值ncols = Integer.parseInt(result[1]);writer.name(result[0]).value(ncols);}else if(count == 1){System.out.println(count + " : " + temp);nrows = Integer.parseInt(result[1]);writer.name(result[0]).value(nrows);}else if(count < 5){System.out.println(count + " : " + temp);writer.name(result[0]).value(Double.parseDouble(result[1]));}else if(count == 5){System.out.println(count + " : " + temp);writer.name(result[0]).value(Integer.parseInt(result[1]));//开始准备写入数据writer.name(dataKey);writer.beginArray(); // [}else if(count < nrows){writer.beginArray(); // [for(String eachCol: result){writer.value(Short.parseShort(eachCol));}writer.endArray(); // ]}else if(count == nrows){writer.endArray(); // ]//结束JSON文件writer.endObject(); // }writer.close();System.out.println("写出器退出!");}else{break;}count++;}fileReader.close();bufferedReader.close();} catch (IOException e) {e.printStackTrace();}finally {try{if (bufferedReader != null) {bufferedReader.close();}if(fileReader != null){fileReader.close();}System.out.println("读取文件成功!");}catch (IOException e) {System.out.println("读取文件失败!");e.printStackTrace();}}}

3.4 测试结果

3.5 注意事项

① 对自定义的读入文件的按行读取,读取解析时需要根据读入文件的特点进行设计。(示例为zhemindem_30.asc文件)

② 需要小心、准确使用如下方法
writer.beginArray();
writer.endArray();
若出现不恰当的使用,导致多出 [ 符号或者 ] 符号,将出现 nest 异常,使程序退出。

基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件相关推荐

  1. java契约_基于契约式设计的Java编译器实现

    上海交通大学硕士学位论文 基于契约式设计的Java编译器实现 学校:上海交通大学 院系:软件学院 专业:计算机软件与理论 班级:B0403791 学号:1040379006 作者姓名:张嘉铭 指导教师 ...

  2. 2017云栖大会·杭州峰会:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇...

    实验背景介绍 了解更多2017云栖大会·杭州峰会 TechInsight & Workshop. 本手册为云栖大会Workshop之<在线用户行为分析:基于流式计算的数据处理及应用> ...

  3. 大数据workshop:《在线用户行为分析:基于流式计算的数据处理及应用》之《实时数据分析:海量日志数据多维透视》篇...

    实验背景介绍 了解更多2017云栖大会·成都峰会 TechInsight & Workshop. 本手册为云栖大会Workshop之<在线用户行为分析:基于流式计算的数据处理及应用> ...

  4. C++流式输入输出加速 给 cin/cout 装个小火箭

    C++流式输法加速 文章目录 C++流式输法加速 1. sync_with_stdio 和 endl 1.1 cin/cout 1.2 endl 2. cin.tie(0) External 相信很多 ...

  5. 2017云栖大会·杭州峰会:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇

    点击有惊喜 实验背景介绍 了解更多2017云栖大会·杭州峰会 TechInsight & Workshop. 本手册为云栖大会Workshop之<在线用户行为分析:基于流式计算的数据处理 ...

  6. 4.布局:FlowLayout流式布局(Java swing 入门)

    FlowLayout(流式布局管理器)是 JPanel 和 JApplet 的默认布局管理器.FlowLayout 会将组件按照从上到下.从左到右的放置规律逐行进行定位.与其他布局管理器不同的是,Fl ...

  7. 基于流式的md5计算-多线程下载工具Lwget介绍

    在数据传输的时候,我们希望实现以下目标: 1. 使用多线程传输,加速下载速度 2. 数据在传输过程中,进行流式md5计算,避免在传输完毕之后校验大文件 3. 支持断点续传 4. 支持http协议和ft ...

  8. Socket基础四:基于流式套接字的网络程序(并发服务器设计)

    作者:刘磊 2020.4.27 参考书目:<Windows网络编程>刘琰等著 并发性 并发性是TCP/IP程序的基础,服务器软件必须在程序中有专门的支持并发的硬件或专门的机制实现并发处理. ...

  9. 基于变色龙认证树的云边端协同流式数据完整性验证模型

    摘要 物联网环境中的终端设备会产生大量的流式数据,如环境感知数据.工业控制数据.人体健康数据等,这些数据全部上传到云服务器会造成巨大的网络负担,云边协同的计算方式能够极大地缓解网络带宽以及云服务器的计 ...

最新文章

  1. JS根据两点的经纬度坐标得到驾车行驶距离
  2. CI/CD 最佳实践的基本原则
  3. * 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数? * 把这些数都输出出来,并且输出总共的个数。
  4. spring boot + mybatis + layui + shiro后台权限管理系统
  5. 记录一下目前thinksoar portal的进度和计划!
  6. linux 服务器硬件报警,Linux服务器硬件运行状态及故障邮件提醒的监控脚本分享...
  7. oracle 中关于 SID db_name、instance_name (转)
  8. 让两个灯隔断时间交替闪烁的电路
  9. Jackson的JSON转对象,忽略不需要的字段
  10. 【系统分析师之路】2020年系统分析师综合知识历年真题
  11. cannot open clipboard
  12. python:实现newton_raphson牛顿拉夫森算法(附完整源码)
  13. 地图飞线图 echart+高德地图实现
  14. 恒生电子(杭州、武汉、上海、、、)来实习来春招
  15. 推荐系统三十六式(刑无刀)学习笔记(三)
  16. 删除指定位置的元素(数组)(PTA)
  17. C++的内存机制,程序变成exe执行的过程
  18. 2010年财富杂志全球500强全名单 沃尔玛居榜首
  19. elasticsearch地理位置查询
  20. [游戏]求生之路新地图安装说明

热门文章

  1. 计算机二级虎贲跟未来教育那个好,考计算机二级的都看看,分享几款模拟软件...
  2. Unity自定义组件之序列帧播放组件
  3. Java中构造方法的案例及常用类int lenght类的使用方法举例,new实例化对象方法,静态方法实例方法的举例
  4. Linux Shell
  5. ProcessingJoy —— 扭来扭去【JAVA】【GLSL】
  6. symbian s60 删除模拟器上的程序
  7. 使Android Home键,Power键等按钮失效
  8. 各大U盘主控有何区别
  9. 有的放矢-电气工程师的工作重心
  10. The Lottery Ticket Hypothesis