一、項(xiàng)目描述
前言:同事希望根據(jù)特定的規(guī)則蓄愁,在4M多的txt文件中提取ip字段双炕,當(dāng)然這個(gè)ip字段滿足一定的規(guī)則。如下圖所示撮抓,當(dāng)存在“| ntp-monlist: ”字段時(shí)妇斤,需要向前找4行,然后將ip取出來(lái)丹拯。如下圖站超,箭頭1不需要截取,箭頭2需要截取乖酬。
希望實(shí)現(xiàn)的功能:將txt文件和jar放在同一個(gè)目錄死相,執(zhí)行java文件后,將文件中的ip字段提取出來(lái)剑刑,存入到txt文件中媳纬。
實(shí)現(xiàn)思路: 第一遍讀取txt文件先找出所需要尋找的ip的段落位置,并將其存入到ArrayList中施掏,第二遍讀取txt文件钮惠,根據(jù)ArrayList將含有ip的字段讀取出來(lái),并將其截取寫入到txt文件中七芭。
二素挽、項(xiàng)目截圖
.jar程序執(zhí)行后,識(shí)別result.txt文件(4M多狸驳,共9千多行)预明,然后將生成result2.txt文件(2千多個(gè)ip),小工具執(zhí)行的結(jié)果如圖所示耙箍。
四撰糠、部分代碼
- 4.1、找到關(guān)鍵詞“| ntp-monlist: ”所在字段辩昆,然后將數(shù)據(jù)存入到Arraylist中阅酪,這里無(wú)法存入到數(shù)組中,因?yàn)閿?shù)組需要賦值初始化。這里需要注意的是术辐,找到關(guān)鍵字以后需要向上找四行砚尽,才是所需要找的ip的位置。
/**
* 讀取txt文件的內(nèi)容辉词,返回命中的arraylist,由于array不可初始化必須要設(shè)置大小必孤。所以用arraylist
* @param file 想要讀取的文件對(duì)象
* @return 返回命中關(guān)鍵字的對(duì)象數(shù)組
*/
public static ArrayList<Integer> getFileArray(File file){
StringBuilder result = new StringBuilder();
ArrayList<Integer> list = new ArrayList<Integer>();
int status=0;
int status2=0;
try{
BufferedReader br = new BufferedReader(new FileReader(file));//構(gòu)造一個(gè)BufferedReader類來(lái)讀取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法,一次讀一
status=status+1;
//判斷是否包含| ntp-monlist:
if(s.equals("| ntp-monlist: ")) {
status2=status2+1;
//命中關(guān)鍵字后瑞躺,向上找4行
list.add(status-4);
}
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return list;
}
- 4.2敷搪、根據(jù)ArrayList的位置,找到對(duì)應(yīng)的段落隘蝎,將取出的字符串存入到ArrayList
/**
* 讀取txt文件的內(nèi)容购啄,根據(jù)數(shù)組下標(biāo),返回命中選中的結(jié)果
* @param file 想要讀取的文件對(duì)象
* @param List 需要提取的行數(shù)
* @return 返回文件內(nèi)容
*/
public static ArrayList<String> getCodeChosseList(File file,ArrayList<Integer> List){
StringBuilder result = new StringBuilder();
ArrayList<String> resultList = new ArrayList<String>();
int status=0;
int status2=0;
try{
BufferedReader br = new BufferedReader(new FileReader(file));//構(gòu)造一個(gè)BufferedReader類來(lái)讀取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法嘱么,一次讀一行
status=status+1;
//判斷是否包含| ntp-monlist:
if(status==List.get(status2)) {
status2=status2+1;
//從第21行開(kāi)始狮含,截取字符串,即ip地址
resultList.add(s.substring(21));
}
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return resultList;
}
- 4.3曼振、將結(jié)果輸出到txt中几迄。
/**
* 將文件寫入到txt中,生成一個(gè)result2.txt文件
* @param file 想要讀取的文件對(duì)象
* @param content 需要寫入的內(nèi)容
* @return 生成一個(gè)文件
*/
public static void writeMsgTxt(File file,String content) throws IOException{
//如果文件不存在,就動(dòng)態(tài)創(chuàng)建文件
if(!file.exists()){
file.createNewFile();
}
FileWriter fw=null;
try {
//設(shè)置為:True,表示寫入的時(shí)候追加數(shù)據(jù)
fw=new FileWriter(file, true);
//回車并換行
fw.write(content+"\r\n");
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fw!=null){
fw.close();
}
}
}
五冰评、源碼
該小工具只是一個(gè)main文件映胁,只是將txt_fetch運(yùn)行起來(lái)。
另外甲雅,如何將main函數(shù)打包成jar可執(zhí)行的文件解孙,百度即可。
- 5.1抛人、項(xiàng)目源代碼:https://github.com/dpc761218914/txt_fetch