Java读取文本文件,按字节长度解析数据入库
一般在解析文件读取数据时,文件每一行的字段与字段之间都会以指定符合隔开,比如:"|"、","等。但是最近一个项目,文件中每一行是以由字段指定的字节长所组成的,中间并无任何符号,这倒是少见。
按照正常的思路,读取每一行时按照指定字节的长度,使用subString截取即可。但是在生产上,文件都是放在linux服务器上的,文件的编码格式一般为:GBK,而且是经过GBK编码的字节文件,subString是截取字符串的,自然不能用了。
那具体该如何做呢,1:替换subString,重写新方法去进行字节截取
2:在解析之前对文件先进行GBK编码
代码贴出来:
/** * 解析黑名单表文件 * * @param filePath * 黑名单表文件路径 * @return blackList 要新增的黑名单集合 * @throws Exception */ public static List<LoanBlackList> parseCunegFile(String filePath) throws Exception { // 创建接受list List<LoanBlackList> blackList = new ArrayList<>(); 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) { // 客户证件号码-19位-截取6-25 String customerIdNumber = StringCommonUtil.substringByte(line,6, 19).trim(); // 黑名单类型-5位-截取167-172 String blackListType = StringCommonUtil.substringByte(line,167, 5).trim(); LoanBlackList lbl = new LoanBlackList(); // 重新set更新数据 lbl.setCustomerIdNumber(customerIdNumber); lbl.setBlackListType(blackListType); blackList.add(lbl); } } catch (IOException e) { e.printStackTrace(); } return blackList; }
其中,这一句进行对文件输入流的字节编码
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; }
相关推荐
Lzs 2020-10-23
聚合室 2020-11-16
零 2020-09-18
Justhavefun 2020-10-22
jacktangj 2020-10-14
ChaITSimpleLove 2020-10-06
Andrea0 2020-09-18
周游列国之仕子 2020-09-15
afanti 2020-09-16
88234852 2020-09-15
YClimb 2020-09-15
风雨断肠人 2020-09-04
卖口粥湛蓝的天空 2020-09-15
stulen 2020-09-15
pythonxuexi 2020-09-06
abfdada 2020-08-26
梦的天空 2020-08-25