场景: Android开发看log时文件过大, 超过2个G, NotePad++无法打开;
前提: 将log文件用AndroidStudio打开(也可用UltraEdit, 关闭 "编辑时使用临时文件" 功能), 可以查看了, 但, 搜索功能不如NotePad++好用; 故想拆分一下log, 只看某一区间的log;
实现: Java实现的, 截取splitStartString与splitEndString之间的Log, 输出在同文件夹下的SplitResult.txt中;
结果: 还行, 2G的log遍历一遍截取保存, 耗时6秒左右;
(写的不好看, 命名不规范, 凑合用吧; 优化空间很大, 欢迎大佬们指点)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
//输出结果的文件名,与输入文件相同目录
public final static String splitFileName = "SplitResult.txt";
//输入文件的文件夹绝对路径
public final static String inputFileFolder = "2个多G的Log文件的父目录(文件所在位置的文件夹的绝对路径)";
//拼接输入文件的绝对路径(方便复制粘贴)
public final static String inputFile =inputFileFolder +"\\"+ "超过2个G的Log.txt(目标文件,与inputFileFolder拼接起绝对路径, 方便复制粘贴 )";
//截取字符串的开头
public final static String splitStartString = "此处填写开始字符串";
//截取字符串的结尾
public final static String splitEndString = "此处填写结束字符串";
public static void main(String[] args) {
// TODO Auto-generated method stub
readFile(new File(inputFile));
}
//将开头与结尾之间的字符串截取下来存到splitFileName中的文件里
static public void readFile(File file) {
FileInputStream fileInputStream = null;
BufferedReader br = null;
BufferedWriter bw = null;
try {
long startTime = System.currentTimeMillis();
fileInputStream = new FileInputStream(file);
br = new BufferedReader(new InputStreamReader(fileInputStream));
File outputFile = new File(file.getParentFile().getAbsolutePath(),splitFileName);
System.out.println("输出文件名:" + "\n" + outputFile.getAbsolutePath());
bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outputFile.getAbsolutePath()),"utf-8"));
String line = null;
boolean matchStart = false;
boolean matchEnd = false;
while((line = br.readLine()) != null){//返回值为null表示读完
//匹配开始字符串, 匹配到后将matchStart置为true
if (!matchStart && line.contains(splitStartString)) {
matchStart = true;
System.out.println("Start line matched:" + "\n"+ line);
}
//匹配到了, 开始复制
if (matchStart) {
//写入
bw.write(line);
bw.newLine();//加入换行, 不加就都在一行
bw.flush();//刷新缓冲
//判断是否是结束字符串, 是则break;
matchEnd = line.contains(splitEndString);
if (matchEnd) {
System.out.println("End line matched:" + "\n"+ line);
System.out.println("截取完成, 耗时:" + ((System.currentTimeMillis() - startTime)*1.0f/1000) + "秒");
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bw.close();
br.close();
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}