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

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
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
 } } }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄