背景:有时候服务运行的日志文件,需要统计分析,但数据量很大,并且直接在文件中看很不直观,这时可以将文件中的内容导入到数据库,入库后的数据就可以按照需求进行统计分析了。

这个是以服务器的访问日志作为示例,一个日志文件中一行的数据格式如下(文件夹中有多个日志文件):

  1. [/Aug/::: +] ******* - "-" "GET https://****/****/image57.png" HIT "******" "image/png"

下面就是具体的读取文件,然后插入到数据库的过程,代码如图:

  1. package com.mobile.web.api;
  2.  
  3. import com.mobile.commons.JsonResp;
  4. import com.mobile.model.LogInfo;
  5. import com.mobile.service.LogInfoService;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.apache.log4j.Logger;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.transaction.annotation.Transactional;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RequestMethod;
  12. import org.springframework.web.bind.annotation.RestController;
  13.  
  14. import java.io.*;
  15. import java.text.ParseException;
  16. import java.text.SimpleDateFormat;
  17. import java.util.ArrayList;
  18. import java.util.Date;
  19. import java.util.List;
  20. import java.util.Locale;
  21.  
  22. @RestController
  23. @RequestMapping(value = "/test")
  24. @Transactional
  25. public class ImportController {
  26. Logger log = Logger.getLogger(this.getClass());
  27.  
  28. @Autowired
  29. private LogInfoService logInfoService;
  30.  
  31. @RequestMapping(value = "/importTxt", method = RequestMethod.GET)
  32. public JsonResp importTxt() throws IOException, ParseException {
  33. log.debug("开始导入数据");
  34.  
  35. String encoding = "GBK";
  36. List logInfoList = new ArrayList();
  37. String dir = "E:\\test\\log";
  38. File[] files = new File(dir).listFiles();
  39. for (File file : files){           //循环文件夹中的文件
  40. if (file.isFile() && file.exists()) { //判断文件是否存在
  41. importFile(file, encoding, logInfoList); //将文件中的数据读取出来,并存放进集合中
  42. } else {
  43. return JsonResp.toFail("文件不存在,请检查文件位置!");
  44. }
  45. }
  46.  
  47. Boolean insertFlag = logInfoService.insertBatch(logInfoList); //将集合中的数据批量入库
  48. if (!insertFlag) {
  49. return JsonResp.toFail("保存失败");
  50. }
  51. return JsonResp.ok();
  52. }
  53.  
  54.   /** 读取数据,存入集合中 */
  55. public static void importFile(File file, String encoding, List logInfoList) throws IOException, ParseException {
  56. InputStreamReader read = null;//考虑到编码格式
  57. try {
  58. read = new InputStreamReader(
  59. new FileInputStream(file), encoding);  //输入流
  60. } catch (UnsupportedEncodingException e) {
  61. e.printStackTrace();
  62. } catch (FileNotFoundException e) {
  63. e.printStackTrace();
  64. }
  65. BufferedReader bufferedReader = new BufferedReader(read);
  66. String lineTxt = null;
  67. SimpleDateFormat sdf = new SimpleDateFormat("[dd/MMM/yyyy:HH:mm:ss Z]", Locale.US); //时间格式化,此处有坑,下边会说到
  68. while ((lineTxt = bufferedReader.readLine()) != null) {  //读取文件内容
  69. String[] lineArr = lineTxt.split(" ");
  70. int len = lineArr.length;
  71. LogInfo logInfo = new LogInfo();     //封装实体对象做入库准备
  72. String logDate = lineArr[] + " " + lineArr[];
  73. System.out.println(sdf.parse(logDate)); //.............时间转换问题
  74. logInfo.setLog1(sdf.parse(logDate));
  75. logInfo.setLog2(lineArr[]);
  76. logInfo.setLog3(lineArr[]);
  77. logInfo.setLog4(lineArr[]);
  78. logInfo.setLog5(lineArr[].substring(, lineArr[].length() - ));
  79. logInfo.setLog6(lineArr[].substring());
  80. logInfo.setLog8(lineArr[].substring(, lineArr[].length() - ));
  81. String accessUrl = lineArr[];
  82. String[] accessUrlArr = accessUrl.split("/");
  83. logInfo.setItemName(accessUrlArr[]);
  84. logInfo.setLog9(lineArr[]);
  85. logInfo.setLog10(lineArr[]);
  86. logInfo.setLog11(lineArr[]);
  87. logInfo.setLog12(lineArr[]);
  88. String[] uaHead = new String[len - ];
  89. System.arraycopy(lineArr, , uaHead, , len - );//数组拷贝,a表示源数组,b表示源数组要复制的起始位置,c表示目标数组,d表示目标数组起始位置,e表示要复制的长度。
  90. logInfo.setLog13(StringUtils.join(uaHead));
  91. logInfo.setFileType(lineArr[len - ]);
  92.  
  93. logInfoList.add(logInfo);
  94. }
  95. read.close(); //输入流关闭
  96.  
  97. }
  98.  
  99. }

文件导入,成功;

    log文件夹下的结构如下图:

    

时间转换时的坑

  1.   SimpleDateFormat sdf = new SimpleDateFormat("[dd/MMM/yyyy:HH:mm:ss Z]", Locale.US);

  字符串转时间时:英文简写为英文格式,而转换时JRE会按照当前地区的语言格式,所以转换失败

  解决方法:带上Locale.US参数

  详细解决可参考:https://www.cnblogs.com/mufengforward/p/9480102.html

此时,如果数据量特别大时,会出现入库慢的情况,有另一种方法是:读取文件后,将数据按照想要的格式存如新文件中,然后用sql语句(或navicat客户端)导入文件;

www.feng16.com

java批量读取多个文件并存入数据库的更多相关文章

  1. Spark1.6.2 java实现读取json数据文件插入MySql数据库

    public class Main implements Serializable { /** * */ private static final long serialVersionUID = -8 ...

  2. 使用JAVA API读取HDFS的文件数据出现乱码的解决方案

    使用JAVA api读取HDFS文件乱码踩坑 想写一个读取HFDS上的部分文件数据做预览的接口,根据网上的博客实现后,发现有时读取信息会出现乱码,例如读取一个csv时,字符串之间被逗号分割 英文字符串 ...

  3. Java项目读取resources资源文件路径那点事

    今天在Java程序中读取resources资源下的文件,由于对Java结构了解不透彻,遇到很多坑.正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径, ...

  4. java使用stream流批量读取并合并文件,避免File相关类导致单文件过大造成的内存溢出。

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  5. java读取本地txt文件并插入数据库

    package com.cniia.ny.web.control.configManage; import java.io.BufferedReader; import java.io.File; i ...

  6. Java中读取properties资源文件

    一.通过ResourceBundle来读取.properties文件 /** * 通过java.util.resourceBundle来解析properties文件. * @param String ...

  7. stream流批量读取并合并文件

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  8. Java 批量反编译class文件,并保持目录结构

    jad -o -r -d d:\src -s java C:\Users\spring\Desktop\egorder3.0\WEB-INF\classes\**\*.class -o - overw ...

  9. java nio读取和写入文件

    读取 package com.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputS ...

随机推荐

  1. 31、iOS 正则表达式判断UITextField是否为全汉字,全字母,全数字,数字和字母

    判断全汉字 if ([self deptNameInputShouldChinese]) { [DemonAlertHelper showToastWithMessage:@"只能是中文&q ...

  2. ThinkPHP 二维码生成

    请求获取并展示二维码 <img src="<?php echo U('createCode?zsnumber='.$time.$kcname['id'].$stuInfo['id ...

  3. JPA错误

    2016-11-141.2016-10-31: hibernate用注解 一对多 报Could not determine type for错误 原因:  接下来继续解决第二个问题:怎么又与集合打交道 ...

  4. Java数组的初始化

    1.动态初始化 数据类型 [] 变量名 = new 数据类型 [数组大小]; //数组的动态初始化 int [] arr = new int [3]; 2.静态初始化 数据类型 [] 变量名 = {元 ...

  5. related work

    Traditional approaches, e.g., genetic algorithm (GA) [2] and ant colony optimization (ACO) [3], can ...

  6. JSTL安装与使用

    第一步:下载支持JSTL的文件.jakarta-taglibs-standard-1.1.2.zip 第二步:下载解压后的两个jar文件:standard.jar和jstl.jar文件拷贝到工程的\W ...

  7. JQuery EasyUI 1.5.1 美化主题大包

    https://my.oschina.net/magicweng/blog/833266

  8. 模板引擎(smarty)知识点总结四

    /*   smarty 引入对象 */ require_once 'libs/Smarty.class.php';  require 'MySmarty.class.php';  $msma = ne ...

  9. _编程语言_C++_std

    正常使用 cout << "Count is "<<i<<endl; 含有std std::cout << "Count ...

  10. 6.form表单四种提交方式

    一.使用jquery的ajax方式提交: 二.使用easyui的form组件内置的submit方法提交: 三.先定义表单,然后使用submit方法提交: 四.先定义表单,然后按下enter键时提交: