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;
    }

猜你喜欢

转载自www.cnblogs.com/xu-zheng/p/8994544.html
今日推荐