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. po编程——自动化测试面试必问

    先来看一个在腾讯课堂首页搜索机构的操作步骤: 1:首先打开腾讯课堂的首页:https://ke.qq.com 2:点击课程或机构的下拉选择图标 3:选择机构 4:在搜索框输入要搜索的机构名称 5:点击 ...

  2. Java文件输入保存,统计某个字符串,统计所有字符串

    import java.io.*; import java.util.*; /** * Created by Admin on 2018/3/20. */ public class FileSaveT ...

  3. huffman树即Huffma编码的实现

    自己写的Huffman树生成与Huffman编码实现 (实现了核心功能 ,打出了每个字符的huffman编码 其他的懒得实现了,有兴趣的朋友可以自己在我的基础增加功能 ) /* 原创文章 转载请附上原 ...

  4. SQL SELECT DISTINCT 语句

    SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值. 语法 ...

  5. June. 24th 2018, Week 26th. Sunday

    Beautiful things don't ask for attention. 真正美丽的东西,并不会刻意寻求别人的注目. From The Secret Life of Walter Mitty ...

  6. Java学习笔记记录(二)

    1.复合语句 if条件语句 使用场景:boolean类型判断.一个范围的判断.几个常量值的判断 有左大括号就没有分号,有分号就没有左大括号. 如下: public class demo1 { stat ...

  7. menu

    <template> <el-row :gutter="10"> <div> <el-row :gutter="10" ...

  8. Koa 中 ejs 模板的使用

    ejs的基本使用 安装 koa-views 和 ejs npm install --save koa-views/cnpm install --save koa-views npm install e ...

  9. appium设置会话时间,可以超长时。Open Application

  10. (九)Delete an Index

    Now let’s delete the index that we just created and then list all the indexes again: 现在让我们删除刚刚创建的索引, ...