互联网金融项目——工作日志玩转文件读取

Posted 喵喵7781

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了互联网金融项目——工作日志玩转文件读取相关的知识,希望对你有一定的参考价值。

  换了新工作,博客停了几个星期,重新开始坚持码博客~不总结,就像出门不穿衣服,别扭的不行。

  最近花两周做的一个项目,主要是对第三方发送过来的核心数据进行合并、校验、加密、压缩、生成明文,密文的过程。

  传送数据采用的文件开始使用.xlsx格式,特点就是3个月数据,按月拆分,多个sheet,数据量大,采用POI的操作模式。windows  系统6g的内存,依然会被跑爆。

  后来应我方需求,按天拆分,分成3种格式的报文,给我们的格式变成了.cvs,后来又变成了.txt。

 

为什么要进行格式的改变?

 

  首先介绍一下这三种文件格式的特征。

  .xlsx: excel文件扩展名,基于新的xml文件压缩格式,包含book,sheet,cell等单元,可以通过POI直接进行office文档操作。

  .csv:  逗号分隔值(Comma-Separated Values),文件以纯文本形式存储表格数据。比如用txt文件打开,就是一行一条记录,以逗号分割。

  .txt:  文本格式,存储文本信息,体积小,存储简单,格式通用,不会中毒。

       从特殊到普通是创造。为了能试用于更多的文件格式,我们采用了最最基础的.txt文件,这样可以把这三种格式的文件,都转换成文本文件,以逗号分割,记录数据信息的形式。进行读取,逐行解析和组装,一站式的操作,可以应对更多的变化。

 

通过IO读取文件,合并  

 

    /**
	 * 读取文件所有行信息
	 * @param fileName 文件路径名称 例如:D:\\\\CreateFile\\\\20160705_1_123.txt;
	 * @return 文件内容
	 */
	public  static  List<String> readAllLines(String fileName)
		List<String> cardInfoList=new ArrayList<String>();
		try 
			@Cleanup
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), StandardCharsets.UTF_8));//换成你的文件名
			String line = null;
			while((line=reader.readLine())!=null)
				cardInfoList.add(line);
			
		 catch (Exception e) 
			e.printStackTrace();
		
		return cardInfoList;

	


	public  static  void writeAllLines(String fileName, List<String> listLines)
		if(listLines == null || listLines.size() == 0)
			return ;

		try 
			@Cleanup
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), StandardCharsets.UTF_8));//换成你的文件名
			int count = 0;
			for (String line:listLines)
			
				if(line != null)
				
					writer.write(line);
					count ++;
					if(count != listLines.size())
						writer.write("\\r\\n");
				
			

			writer.flush();
			writer.close();
		 catch (Exception e) 
			e.printStackTrace();
		

	

 

 

 

 

 

 

 

获取.txt为后缀的所有文件,获取整个文件名(含路径) / 获取文件名(不含路径)

 

 

 

        String plainFilePath = "D:\\\\job\\\\codeSource\\\\data\\\\plain\\\\";
        File file = new File(plainFilePath);
        File[] tempList = file.listFiles();
        List<String> listFile = new ArrayList<String>();
        String fileName ;
        for (int i = 0; i < tempList.length; i++) 
            fileName = tempList[i].toString();
            if(!fileName.substring(fileName.length() - 3).equals("txt"))//获取后缀为.txt为后缀的所有文件
                continue;
            listFile.add(tempList[i].toString());
        

   String holeFilePath ;
   String partFilePath ;
   CreditMessage message = new CreditMessage();
   //读取明文内容,并解析成message
   for (int j = 0; j < listFile.size(); j++) 
     holeFilePath = listFile.get(j);//获取整个文件路径+文件名
     partFilePath = holeFilePath.substring(holeFilePath.lastIndexOf("\\\\") + 1, holeFilePath.lastIndexOf("."));//获取文件名
   }

 

 

 

 

 

   

 

Byte数组的截取

 

 /**
     * 获取头string字符串
     * @param Length  截取长度
     * @param start 截取初始位置
     * @param end  截取终止位置
     * @param creditMessageHead 截取字符串
     * @return 截取字符串
     */
    private static String getMessageHeadMessge(int Length, int start, int end, byte[] creditMessageHead)
        byte[] strDataVersion=new byte[Length];
        for(int i =start;i<end;i++)
            strDataVersion[i-start]=creditMessageHead[i];
        
        String str=null;
        try
             str=new String (strDataVersion,"GB18030").trim();
        catch (Exception e)
            e.printStackTrace();
        
        return  str ;
    

 

 

 

 

 

 

枚举的使用

 

 

//枚举定义
@Getter
public enum ItemIdentityEnum 
    CREDIT_AMOUNT("9100", "授信额度", DataType.N, 10, true),
    SHARE_CREDIT_AMOUNT("9101", "共享授信额度", DataType.N, 10, true),
   
    //标识符
    private String   code;
    //数据项名称
    private String   name;
    //类型
    private DataType type;
    //长度
    private int      length;
    //是否必填
    private boolean  required;

    ItemIdentityEnum(String code, String name, DataType type, int length, boolean required) 
        this.code = code;
        this.name = name;
        this.type = type;
        this.length = length;
        this.required = required;
    


//枚举取值

ItemIdentityEnum.CREDIT_AMOUNT.getLengt();

//枚举赋值
public CreditMessageBaseSegment setBusinessCategory(BusinessCategoryEnum value) 
  businessCategory.setValue(value);
  return this;


 

 

 

 

 

 

异常的使用

 

  public static void writeLogFile(Exception e,String businessNo)
            try
                FileWriter fileWriter=null;
                //创建文件的输出流
                fileWriter=new FileWriter("D:\\\\error\\\\error.txt",true);
                fileWriter.write("\\r\\n"+e+"\\r\\n"+"业务号:"+businessNo+"\\r\\n");
                fileWriter.close();
            
            catch(Exception s)
                s.printStackTrace();
            
        

 

 

 

 

 

   项目比较小,用时2周,最终达到的效果是,能读取各种类型文件,校验过程中无需叫停,一站记录所有错误日志,明文生成、校验、压缩解耦合,避免了操作之间的干扰。

  这是新公司的第一个入手项目,运行结果,很让人激动兴奋,很开心能跟如此优秀的人一起共事,进步。感恩所经历的一切人和事~

 

 

  

 

以上是关于互联网金融项目——工作日志玩转文件读取的主要内容,如果未能解决你的问题,请参考以下文章

金融科技,科技金融,互联网金融

i5牵手腾讯云 大数据玩转“互联网+”

玩日志的你不了解 Filebeat ,就像搞结拜不认识关二爷!深度解析 Filebeat 工作原理,轻松玩转大数据!

玩日志的你不了解 Filebeat ,就像搞结拜不认识关二爷!深度解析 Filebeat 工作原理,轻松玩转大数据!

版本管理·玩转git(日志查看与版本切换)

翼支付在Sharding-Sphere项目工作介绍