txt文件按行处理工具类(可以分析日志、截取小说等)

  1. package file;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.FileOutputStream;
  8. import java.io.InputStreamReader;
  9. import java.io.OutputStreamWriter;
  10. import java.io.PrintWriter;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.regex.Matcher;
  14. import java.util.regex.Pattern;
  15.  
  16. public class ReadTxtUtil {
  17.  
  18. public static void main1(String[] args) throws Exception {
  19. getDesired();
  20. }
  21.  
  22. /**
  23. * 取出想要的文件
  24. * @date 2019年4月1日 上午11:26:36
  25. * @throws Exception
  26. */
  27. public static void getDesired() throws Exception {// 输入文件路径
  28.  
  29. List<String> temp = new ArrayList<>();
  30. //输入文件
  31. // File f = new File("D:\\a\\b\\in.txt");
  32. File f = new File("D:\\a\\info_log-2019-04-10h2.log");
  33. // InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
  34. InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"utf-8");
  35. BufferedReader br = new BufferedReader(reader);
  36. String str=null;
  37.  
  38. //下面按行读。我实现的其实就是变相的分行打印,如果有更好的方法请大家指教
  39. //输出文件
  40. OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("D:\\a\\b\\out11.txt"),"utf-8");
  41. BufferedWriter bw = new BufferedWriter(os);
  42. PrintWriter out = new PrintWriter(bw);
  43. //定义开始写入新文件标记
  44. boolean start = false;
  45. //结束写入标记
  46. boolean end = false;
  47. // 从 包含文字 :第一三四三章 展现力量(第四更!) 的行开始复制写入到新文件中
  48. String matchStart = "20190323964的处理预计线程数为:4,";
  49. String matchEnd = "scheduler_Worker-8的--consume time----任务耗时:2363317 毫秒";
  50. while((str=br.readLine())!=null){
  51.  
  52. if (!start) {
  53. if (str.contains(matchStart)) {
  54. start = true;
  55. System.out.println("找到开始字符串"+str);
  56. }
  57. }
  58.  
  59. if (str.contains(matchEnd)) {
  60. end = true;
  61. System.out.println("找到结束字符串"+str);
  62. }
  63.  
  64. if (start) {
  65. if (end) {
  66. break;
  67. }
  68. //符合标记,逐行写入到新文件
  69. out.println(str);
  70. }
  71. }
  72.  
  73. br.close();
  74. reader.close();
  75.  
  76. bw.close();
  77. os.close();
  78. out.close();
  79. }
  80.  
  81. // --------------下面才是真正使用的---------------
  82.  
  83. /**
  84. * @param inFileName 输入文件名称(全路径)
  85. * @param outFileName 输出文件名称
  86. * @param matchStart 要匹配的开始字符串(如果为null,则从文件开头开始)
  87. * @param matchEnd 要匹配的结束字符串(如果为null,则直到文件结尾)
  88. * @param matchContain 要匹配的行内字符串(如果为null,则全部输出;如果不为null,则只输出包含matchContain字符串的行)
  89. * @throws Exception
  90. */
  91. public static void getDesired(String inFileName,String outFileName,String matchStart,String matchEnd,String matchContain) throws Exception {// 输入文件路径
  92.  
  93. List<String> temp = new ArrayList<>();
  94. //输入文件
  95. // File f = new File("D:\\a\\b\\in.txt");
  96. // File f = new File("D:\\a\\info_log-2019-04-10h2.log");
  97. File f = new File(inFileName);
  98. // InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
  99. InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"utf-8");
  100. BufferedReader br = new BufferedReader(reader);
  101. String str=null;
  102.  
  103. //下面按行读。我实现的其实就是变相的分行打印,如果有更好的方法请大家指教
  104. //输出文件
  105. // OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("D:\\a\\b\\out11.txt"),"utf-8");
  106. OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(outFileName),"utf-8");
  107. BufferedWriter bw = new BufferedWriter(os);
  108. PrintWriter out = new PrintWriter(bw);
  109. //定义开始写入新文件标记
  110. boolean startF = false;
  111. //结束写入标记
  112. boolean endF = false;
  113.  
  114. // 从 包含文字 :第一三四三章 展现力量(第四更!) 的行开始复制写入到新文件中
  115. // String matchStart = "20190323964的处理预计线程数为:4,";
  116. // String matchEnd = "scheduler_Worker-8的--consume time----任务耗时:2363317 毫秒";
  117. while((str=br.readLine())!=null){
  118.  
  119. if (matchStart != null) {
  120. if (!startF) {
  121. if (str.contains(matchStart)) {
  122. startF = true;
  123. System.out.println("找到开始字符串"+str);
  124. }
  125. }
  126. }else {
  127. startF = true;
  128. }
  129.  
  130. if (matchEnd!=null) {
  131. if (str.contains(matchEnd)) {
  132. endF = true;
  133. System.out.println("找到结束字符串"+str);
  134. }
  135. }
  136.  
  137. if (startF) {
  138. if (endF) {
  139. break;
  140. }
  141. //如果有每行需要匹配的东西则只输出匹配的行
  142. if (matchContain!=null) {
  143. if (str.contains(matchContain)) {
  144. //符合标记,逐行写入到新文件
  145. // hLine1(str, matchContain); //可以对要输出的行进行特殊处理
  146. out.println(str);
  147. }
  148. }else {
  149. //如果没有设置每行匹配的字符串,则输出开始到结尾所有行的内容
  150. //符合标记,逐行写入到新文件
  151. out.println(str);
  152. }
  153.  
  154. }
  155. }
  156.  
  157. br.close();
  158. reader.close();
  159.  
  160. bw.close();
  161. os.close();
  162. out.close();
  163. }
  164.  
  165. /**
  166. * 将当期行只取出时间字符串加上以要匹配的字符开头的部分
  167. * @param source 原始字符串
  168. * @param startRe 从startRe开始匹配,即只返回startRe其后的部分
  169. */
  170. public static void hLine1(String source,String startRe) {
  171. // String s ="[fm-log] 2019-04-25 14:26:01,040 [DubboServerHandler-10.128.90.162:3009-thread-148] INFO - 批量实名认证Timer---入参CUST_ID:{}200004031631";
  172. String timeRe = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3})";
  173. // String startRe="批量实名认证Timer";
  174. //匹配事件字符串 2019-04-25 14:26:01,872
  175. // String regex = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}).*(批量实名认证Timer.*)";
  176. String regex = timeRe+".*("+startRe+".*)";
  177. Pattern p = Pattern.compile(regex);
  178. Matcher m = p.matcher(source);
  179. if (m.find()) {
  180. source=m.group(1)+"===="+m.group(2);
  181. System.out.println(source); //2019-04-25 14:26:01,040====批量实名认证Timer---入参CUST_ID:{}200004031631
  182. }
  183. }
  184.  
  185. //使用
  186. public static void main(String[] args) throws Exception {
  187. // D:/a/d/info_log-2019-04-25.log
  188. getDesired("D:/a/d/info_log-2019-04-25.log", "D:/a/d/1.txt", null, null, "批量实名认证Timer---");
  189. }
  190.  
  191. //取出时间字符串测试
  192. public static void main2(String[] args) {
  193. String s = "[fm-log] 2019-04-25 14:26:01,872 [DubboServerHandler-10.128.90.162:3009-thread-148";
  194. //匹配事件字符串 2019-04-25 14:26:01,872
  195. String regex = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}";
  196. Pattern p = Pattern.compile(regex);
  197. Matcher m = p.matcher(s);
  198. if (m.find()) {
  199. System.out.println(m.group()); //2019-04-25 14:26:01,872
  200. }
  201.  
  202. }
  203.  
  204. }

注意:

使用中如果发现输出文件中没有数据,请检查输入文件的编码是否为UTF-8 如果为GBK,请修改代码中的:

  1. // InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
  2. InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"utf-8");

为 GBK。

txt文件按行处理工具类(可以截取小说、分析日志等)【我】的更多相关文章

  1. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  2. 【转载】C#工具类:实现文件操作File的工具类

    在应用程序的开发中,文件操作的使用基本上是必不可少的,FileStream类.StreamWriter类.Directory类.DirectoryInfo类等都是文件操作中时常涉及到的类,我们可以通过 ...

  3. 从接口自动化测试框架设计到开发(二)操作json文件、重构json工具类

    用例模板里的请求数据多,看起来很乱,所以可以通过访问另外一个文件的方式获取请求数据 把请求数据都放在一个json文件中 取出login的内容: import json fp = open('G:/un ...

  4. Java文件编码自动转换工具类(只改变编码,不会改变文件内容)

    本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. public class Cha ...

  5. iOS开发 -- 为本地文件添加自定义属性的工具类

    前言:实际开发,我们可能会有这样的需求,就是为文件添加自定义的属性,或者是可以将文件的相关信息添加进该文件的属性中,这样可以以备下次读取利用. 那么本文就是要介绍"拓展文件属性的工具类&qu ...

  6. 【转载】Java文件编码自动转换工具类

    本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. 1 public class C ...

  7. Spring MVC文件上传下载工具类

    import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import ...

  8. 删除txt文件每行第一(n)个空格前内容的方法

    1. 把要处理的文本保存在a.txt文件中 2. 在相同文件夹中新建一个xx.txt文件,输入下面代码,再把文件名改为xx.bat. @echo offset fn=a.txt(for /f &quo ...

  9. Android 命令行执行工具类

    最近在做android项目的时候,需要执行命令行命令,之前在网上找的不仅杂乱而且错误多,于是自己写了一份. 话不多说,直接上代码 import android.util.Log; import jav ...

随机推荐

  1. gitbook 入门教程之插件介绍

    插件是 gitbook 的扩展功能,很多炫酷有用的功能都是通过插件完成的,其中插件有官方插件和第三方插件之分. 推荐官方插件市场 https://plugins.gitbook.com/ 寻找或下载相 ...

  2. Windows系统下搭建Git本地代码库

    近由于工作需要,要把工作代码做一下版本管理.工作代码也不方便放到github上,也不想付费建私密库,公司也没几个人,所以就想着搭建一个本地Git版本库,来做版本管理.搭建过程如下. 系统环境:Dell ...

  3. 简说raid1 raid2 raid5 raid6 raid10的优缺点和做各自raid需要几块硬盘

    Raid 0:一块硬盘或者以上就可做raid0优势:数据读取写入最快,最大优势提高硬盘容量,比如3快80G的硬盘做raid0 可用总容量为240G.速度是一样.缺点:无冗余能力,一块硬盘损坏,数据全无 ...

  4. MS SQL自定义函数IsNumeric

    判断字符串是否为纯数字,负数不算.如'00012','54585','1000' SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUN ...

  5. Linux学习历程——Centos 7 tar命令

    一.命令介绍 tar命令用于对文件进行打包压缩或解压. tar常用参数 参数 作用 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -r 向压缩归档末尾追加文件 -u 更新压缩包 ...

  6. js 学习之路4:js运行/输出中文乱码问题解决

    网上找了一个简单的例子,编写出来很简单,但是乱码的问题稍微困扰了一下. 题目: 1. 大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配? js解决代码: ...

  7. JavaScript -- 原型:prototype的使用

    JavaScript -- 原型:prototype的使用 在 JavaScript 中,prototype 是函数的一个属性,同时也是由构造函数创建的对象的一个属性. 函数的原型为对象. 它主要在函 ...

  8. nmap比较详细的使用方法

    nmap 信息收集工具 -sP 192.168.1.0/24  区域网内存活主机扫描  -O 192.168.1.1    获取操作系统 nmap -sS -sV baidu.com    -sS 使 ...

  9. 使用superlance插件增强supervisor的监控能力

    supervisor与superlance简介 supervisor是一款用python编写的进程监控.进程守护和进程管理的工具,可以工作在各种UNIX-like的操作系统上,通过简单的配置就可以启动 ...

  10. MySQL之ORM框架SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...