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

package file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class ReadTxtUtil { public static void main1(String[] args) throws Exception {
getDesired();
} /**
* 取出想要的文件
* @date 2019年4月1日 上午11:26:36
* @throws Exception
*/
public static void getDesired() throws Exception {// 输入文件路径 List<String> temp = new ArrayList<>();
//输入文件
// File f = new File("D:\\a\\b\\in.txt");
File f = new File("D:\\a\\info_log-2019-04-10h2.log");
// InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"utf-8");
BufferedReader br = new BufferedReader(reader);
String str=null; //下面按行读。我实现的其实就是变相的分行打印,如果有更好的方法请大家指教
//输出文件
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("D:\\a\\b\\out11.txt"),"utf-8");
BufferedWriter bw = new BufferedWriter(os);
PrintWriter out = new PrintWriter(bw);
//定义开始写入新文件标记
boolean start = false;
//结束写入标记
boolean end = false;
// 从 包含文字 :第一三四三章 展现力量(第四更!) 的行开始复制写入到新文件中
String matchStart = "20190323964的处理预计线程数为:4,";
String matchEnd = "scheduler_Worker-8的--consume time----任务耗时:2363317 毫秒";
while((str=br.readLine())!=null){ if (!start) {
if (str.contains(matchStart)) {
start = true;
System.out.println("找到开始字符串"+str);
}
} if (str.contains(matchEnd)) {
end = true;
System.out.println("找到结束字符串"+str);
} if (start) {
if (end) {
break;
}
//符合标记,逐行写入到新文件
out.println(str);
}
} br.close();
reader.close(); bw.close();
os.close();
out.close();
} // --------------下面才是真正使用的--------------- /**
* @param inFileName 输入文件名称(全路径)
* @param outFileName 输出文件名称
* @param matchStart 要匹配的开始字符串(如果为null,则从文件开头开始)
* @param matchEnd 要匹配的结束字符串(如果为null,则直到文件结尾)
* @param matchContain 要匹配的行内字符串(如果为null,则全部输出;如果不为null,则只输出包含matchContain字符串的行)
* @throws Exception
*/
public static void getDesired(String inFileName,String outFileName,String matchStart,String matchEnd,String matchContain) throws Exception {// 输入文件路径 List<String> temp = new ArrayList<>();
//输入文件
// File f = new File("D:\\a\\b\\in.txt");
// File f = new File("D:\\a\\info_log-2019-04-10h2.log");
File f = new File(inFileName);
// InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"utf-8");
BufferedReader br = new BufferedReader(reader);
String str=null; //下面按行读。我实现的其实就是变相的分行打印,如果有更好的方法请大家指教
//输出文件
// OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("D:\\a\\b\\out11.txt"),"utf-8");
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(outFileName),"utf-8");
BufferedWriter bw = new BufferedWriter(os);
PrintWriter out = new PrintWriter(bw);
//定义开始写入新文件标记
boolean startF = false;
//结束写入标记
boolean endF = false; // 从 包含文字 :第一三四三章 展现力量(第四更!) 的行开始复制写入到新文件中
// String matchStart = "20190323964的处理预计线程数为:4,";
// String matchEnd = "scheduler_Worker-8的--consume time----任务耗时:2363317 毫秒";
while((str=br.readLine())!=null){ if (matchStart != null) {
if (!startF) {
if (str.contains(matchStart)) {
startF = true;
System.out.println("找到开始字符串"+str);
}
}
}else {
startF = true;
} if (matchEnd!=null) {
if (str.contains(matchEnd)) {
endF = true;
System.out.println("找到结束字符串"+str);
}
} if (startF) {
if (endF) {
break;
}
//如果有每行需要匹配的东西则只输出匹配的行
if (matchContain!=null) {
if (str.contains(matchContain)) {
//符合标记,逐行写入到新文件
// hLine1(str, matchContain); //可以对要输出的行进行特殊处理
out.println(str);
}
}else {
//如果没有设置每行匹配的字符串,则输出开始到结尾所有行的内容
//符合标记,逐行写入到新文件
out.println(str);
} }
} br.close();
reader.close(); bw.close();
os.close();
out.close();
} /**
* 将当期行只取出时间字符串加上以要匹配的字符开头的部分
* @param source 原始字符串
* @param startRe 从startRe开始匹配,即只返回startRe其后的部分
*/
public static void hLine1(String source,String startRe) {
// String s ="[fm-log] 2019-04-25 14:26:01,040 [DubboServerHandler-10.128.90.162:3009-thread-148] INFO - 批量实名认证Timer---入参CUST_ID:{}200004031631";
String timeRe = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3})";
// String startRe="批量实名认证Timer";
//匹配事件字符串 2019-04-25 14:26:01,872
// String regex = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}).*(批量实名认证Timer.*)";
String regex = timeRe+".*("+startRe+".*)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(source);
if (m.find()) {
source=m.group(1)+"===="+m.group(2);
System.out.println(source); //2019-04-25 14:26:01,040====批量实名认证Timer---入参CUST_ID:{}200004031631
}
} //使用
public static void main(String[] args) throws Exception {
// D:/a/d/info_log-2019-04-25.log
getDesired("D:/a/d/info_log-2019-04-25.log", "D:/a/d/1.txt", null, null, "批量实名认证Timer---");
} //取出时间字符串测试
public static void main2(String[] args) {
String s = "[fm-log] 2019-04-25 14:26:01,872 [DubboServerHandler-10.128.90.162:3009-thread-148";
//匹配事件字符串 2019-04-25 14:26:01,872
String regex = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group()); //2019-04-25 14:26:01,872
} } }

注意:

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

//        InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
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. C#开发WEBService服务 C++开发客户端调用WEBService服务

    编写WEBService服务端应用程序并部署 http://blog.csdn.net/u011835515/article/details/47615425 编写调用WEBService的C++客户 ...

  2. 基本的CRUD操作

    导入包---实体类------数据库连接----数据库操作----service层数据操作----网页对service层可视化实现 model package com.ij34.model; publ ...

  3. 谈谈你对this对象的理解

    理解: 1.this是js 的一个关键字,随着函数的使用场合的不同,this 的值会发生变化. 2.一个总原则:即this指的是调用函数的那个对象. 3.一般情况下,this 是全局对象,可以作为方法 ...

  4. Python高级应用(3)—— 为你的项目添加验证码

    验证码简介 验证码的作用: 验证码在现在来说,是很常见的东西,可以一定程度的保护网站,比如防止网络爬虫恶意爬取网站数据啊,减少低级的攻击啊什么的.但是高级点的骚操作还是不太好防范,所以现在的验证码平台 ...

  5. [spring boot] Table 'yhm.hibernate_sequence' doesn't exist

    在使用该注解时:@GeneratedValue要注意的几点: @GeneratedValue注解的strategy属性提供四种值: -AUTO主键由程序控制, 是默认选项 ,不设置就是这个 -IDEN ...

  6. Python基础——6面向对象编程

    类和实例 类是抽象的模版,例如汽车:而实例则是拥有相同方法的类的实现,例如汽车里面有大众.宝马.奔驰等等,这些车都能在地面上跑,但是它们的具体数据可以不一样. calss Student(object ...

  7. IDEA 相关整理

    插件部分 Lombok 日志不定义

  8. F. Multicolored Markers(数学思维)

    思维:思维就是将大的矩形放在小矩形里面,让大矩形的宽和长尽量靠近. 很容易得到 (a+b)% i = 0 的话, 保证了大矩形的形成,同时里面表示了两种情况:1, a % i =0, b % i=0; ...

  9. winserver的consul部署实践与.net core客户端使用(附demo源码)

    winserver的consul部署实践与.net core客户端使用(附demo源码)   前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的 ...

  10. 在Mac OS X下使用Apache、PHP、MySQL、Netbeans、Yii

    本文环境: Mac OS X:10.8.4 Apache:2.2.22 PHP:5.3.15 Netbeans:7.3.1 Yii:1.1.14 Mac OS X是内置了Apache服务器的,不过默认 ...