前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java根据字节长度进行txt文件解析

java根据字节长度进行txt文件解析

作者头像
故久
发布2021-11-22 13:40:37
9990
发布2021-11-22 13:40:37
举报
文章被收录于专栏:故久故久

在日常开发中,有时候需要对第三方文件推送过来的数据文件进行解析,双方约定的格式是GBK编码,一行代表一条记录,字节定长的方式去存入和获取,这样就不能用substring进行字符截取了,具体实现方法直接看代码吧:

/** * 解析第三方传入文件 * * @param filePath * 传入文件路径 * @throws Exception */ public static void parseFile(String filePath) throws Exception { try { File file = new File(filePath); InputStream is = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(is,Charset.forName("GBK"))); String line = ""; while ((line = br.readLine()) != null) { // 客户名-20位-截取6-25 String cifName= StringCommonUtil.substringByte(line,6, 19).trim(); // 身份证号-18位-截取31-48 String blackListType = StringCommonUtil.substringByte(line,31, 17).trim(); //todo其他业务处理 } } catch (IOException e) { e.printStackTrace(); } }

其中,这一句进行对文件输入流的字节编码(如果约定其他编码,可以统一替换为其他格式)

代码语言:javascript
复制
BufferedReader br = new BufferedReader(new InputStreamReader(is,Charset.forName("GBK")));

字节截取的方法如下:

/** * 按字节截取字符串 ,指定截取起始字节位置与截取字节长度 * * @param orignal * 要截取的字符串 * @param offset * 截取Byte长度; * @return 截取后的字符串 * @throws UnsupportedEncodingException * 使用了JAVA不支持的编码格式 */ public static String substringByte(String orignal, int start, int count) {

// 如果目标字符串为空,则直接返回,不进入截取逻辑; if (orignal == null || "".equals(orignal)) return orignal;

// 截取Byte长度必须>0 if (count <= 0) return orignal;

// 截取的起始字节数必须比 if (start < 0) start = 0;

// 目标char Pull buff缓存区间; StringBuffer buff = new StringBuffer();

try { // 截取字节起始字节位置大于目标String的Byte的length则返回空值 if (start >= getStringByteLenths(orignal)) return null; int len = 0; char c; // 遍历String的每一个Char字符,计算当前总长度 // 如果到当前Char的的字节长度大于要截取的字符总长度,则跳出循环返回截取的字符串。 for (int i = 0; i < orignal.toCharArray().length; i++) { c = orignal.charAt(i);

// 当起始位置为0时候 if (start == 0) { len += String.valueOf(c).getBytes("GBK").length; if (len <= count) buff.append(c); else break; } else { // 截取字符串从非0位置开始 len += String.valueOf(c).getBytes("GBK").length; if (len >= start && len <= start + count) { buff.append(c); } if (len > start + count) break; } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 返回最终截取的字符结果; // 创建String对象,传入目标char Buff对象 return new String(buff); }

/** * 计算当前String字符串所占的总Byte长度 * * @param args * 要截取的字符串 * @return 返回值int型,字符串所占的字节长度,如果args为空或者“”则返回0 * @throws UnsupportedEncodingException */ public static int getStringByteLenths(String args) throws UnsupportedEncodingException { return args != null && args != "" ? args.getBytes("GBK").length : 0; }

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档