假设某个目录下有多份话单文件,每个话单文件都比较大,独立处理一个文件耗时比较大。
话单文件,billing1.txt 、billing2.txt、。。。。。billingN.txt
根据指定的主叫号,统计指定的主叫号所有的通话记录,并统一输出到result.txt文件中
话单格式
思路:
使用多线程减压(消峰)
个人案例,代码为主
package com.njwbhz.march.week2.part0310.program;
import java.io.*;
import java.util.Map;
import java.util.TreeMap;
public class CallingTicket {
public static void PrintCallingTicket () {
Map map = new TreeMap();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("src/com/njwbhz/march/week2/part0310/program/callRecord.txt"));
String string =null;
String [] datas = null;
while ((string = reader.readLine()) != null) {
datas = string.split(" | ");
if (!map.containsKey(datas[0])){
map.put(datas[0] , datas[4]);
} else {
map.put(datas[0] , String.valueOf(Integer.valueOf(map.get(datas[0])) + Integer.valueOf(datas[4])));
}
}
// map.entrySet().forEach(entry -> System.out.println(entry.getKey() + "t" + entry.getValue() + "秒"));
map.entrySet().forEach(entry -> {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter("src/com/njwbhz/march/week2/part0310/program/callTicked.txt"));
writer.write(entry.getKey() + "t" + entry.getValue() + "秒" + "n");
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.njwbhz.march.week2.part0310.program;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CallRecord {
private long callingNumber;
private long calledNumber;
private long callDuration;
private Date date;
private SimpleDateFormat simpleDateFormat;
private StringBuffer callRecord;
public CallRecord() {
}
public CallRecord(long callingNumber, long calledNumber, long callDuration, Date date) {
callRecord = new StringBuffer();
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
this.callingNumber = callingNumber;
this.calledNumber = calledNumber;
this.callDuration = callDuration;
this.date = date;
callRecord
.append(callingNumber)
.append(" | ")
.append(calledNumber)
.append(" | ")
.append(callDuration)
.append(" | ")
.append(simpleDateFormat.format(date))
.append("n");
}
public long getCallingNumber() {
return callingNumber;
}
public void setCallingNumber(long callingNumber) {
this.callingNumber = callingNumber;
}
public long getCalledNumber() {
return calledNumber;
}
public void setCalledNumber(long calledNumber) {
this.calledNumber = calledNumber;
}
public long getCallDuration() {
return callDuration;
}
public void setCallDuration(long callDuration) {
this.callDuration = callDuration;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public SimpleDateFormat getSimpleDateFormat() {
return simpleDateFormat;
}
public void setSimpleDateFormat(SimpleDateFormat simpleDateFormat) {
this.simpleDateFormat = simpleDateFormat;
}
public StringBuffer getCallRecord() {
return callRecord;
}
public void setCallRecord(StringBuffer callRecord) {
this.callRecord = callRecord;
}
}
package com.njwbhz.march.week2.part0310.program;
import java.io.File;
import java.util.Scanner;
public class CallRecordApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String targetNumber;
//输入查询目标
System.out.println("请输入查询号码");
targetNumber = scanner.next();
File readerFile = new File("src/com/njwbhz/march/week2/part0310/program/callRecord");
File writerFile = new File("src/com/njwbhz/march/week2/part0310/program/result.txt");
File [] callRecordFiles = readerFile.listFiles();
for (File callRecordFile : callRecordFiles) {
new Thread(new ReadCallRecord(callRecordFile , writerFile , targetNumber)).start();
}
}
}
package com.njwbhz.march.week2.part0310.program;
import java.util.Date;
import java.util.Scanner;
public class Phone {
public void call () {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入主叫号的手机号码:");
long callingNumber = scanner.nextLong();
System.out.println("请输入被叫号的手机号码:");
long calledNumber = scanner.nextLong();
calling(callingNumber , calledNumber);
}
private void calling (long callingNumber , long calledNumber) {
Date date;
long startTime;
long overTime;
Scanner scanner = new Scanner(System.in);
System.out.println("输入任意内容开始通话");
date = new Date();
startTime = System.currentTimeMillis();
scanner.next();
System.out.println("通话中······");
System.out.println("输入任意内容结束通话");
scanner.next();
overTime = System.currentTimeMillis();
new SaveCallRecordByBufferedOutPutStream(new CallRecord(callingNumber , calledNumber , (overTime - startTime)/1000 , date));
}
}
package com.njwbhz.march.week2.part0310.program;
import java.io.*;
import java.util.Map;
import java.util.TreeMap;
public class ReadCallRecord implements Runnable {
private File readerfile;
private File writerfile;
private String targetNumber;
public ReadCallRecord(File readerfile, File writerfile, String targetNumber) {
this.readerfile = readerfile;
this.writerfile = writerfile;
this.targetNumber = targetNumber;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
readCallRecord(readerfile , writerfile , targetNumber);
}
private void readCallRecord (File readerfile , File writerfile , String targetNumber) {
BufferedReader reader = null;
BufferedWriter writer = null;
try {
reader = new BufferedReader(new FileReader(readerfile));
String lineData =null;
String [] datas = null;
while ((lineData = reader.readLine()) != null) {
datas = lineData.split(" | ");
if (datas[0].equalsIgnoreCase(targetNumber)) {
//交给线程
new Thread(new WriteResult(lineData , new BufferedWriter(new FileWriter(writerfile , true)))).start();
}
lineData = reader.readLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
result.txt 121 | 1212314312412341234 | 5 | 2022-03-10 14:53:35 121 | 1213 | 2 | 2022-03-10 14:52:52 121 | 123423 | 1 | 2022-03-10 14:54:08 121 | 1212 | 11 | 2022-03-10 14:58:09 121 | 213321 | 6 | 2022-03-10 14:55:07 121 | 12 | 1 | 2022-03-10 14:53:11 121 | 1212314312412341234 | 5 | 2022-03-10 14:53:35 121 | 3415265767 | 1 | 2022-03-10 14:58:42 121 | 122 | 1 | 2022-03-10 14:50:42 121 | 2132145 | 16 | 2022-03-10 14:57:22 121 | 124 | 3 | 2022-03-10 14:51:10 121 | 123456 | 4 | 2022-03-10 14:59:00 121 | 23241341 | 3 | 2022-03-10 14:56:53 121 | 126 | 3 | 2022-03-10 14:51:47
package com.njwbhz.march.week2.part0310.program;
import java.io.*;
public class SaveCallRecordByBufferedOutPutStream {
public SaveCallRecordByBufferedOutPutStream(CallRecord callRecord) {
try {
// BufferedWriter writer = new BufferedWriter(new FileWriter("src/com/njwbhz/march/week2/part0310/program/callRecord/callRecord1.txt" , true));
// BufferedWriter writer = new BufferedWriter(new FileWriter("src/com/njwbhz/march/week2/part0310/program/callRecord/callRecord2.txt" , true));
// BufferedWriter writer = new BufferedWriter(new FileWriter("src/com/njwbhz/march/week2/part0310/program/callRecord/callRecord3.txt" , true));
// BufferedWriter writer = new BufferedWriter(new FileWriter("src/com/njwbhz/march/week2/part0310/program/callRecord/callRecord4.txt" , true));
BufferedWriter writer = new BufferedWriter(new FileWriter("src/com/njwbhz/march/week2/part0310/program/callRecord/callRecord5.txt" , true));
String string = String.valueOf(callRecord.getCallRecord());
char [] datas = string.toCharArray();
writer.write(datas , 0 , datas.length);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.njwbhz.march.week2.part0310.program;
import java.io.*;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class WriteResult implements Runnable {
private String message;
private BufferedWriter writer;
public static synchronized void write (String message , BufferedWriter writer) {
try {
writer.write(message);
writer.newline();
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
write(message , writer);
}
public WriteResult(String message, BufferedWriter writer) {
this.message = message;
this.writer = writer;
}
}
package com.njwbhz.march.week2.part0310.program;
import com.njwbhz.march.week2.part0308.program.CallingTicket;
public class TestCallingTicket {
public static void main(String[] args) {
CallingTicket.PrintCallingTicket();
}
}
package com.njwbhz.march.week2.part0310.program;
public class TestPhone {
public static void main(String[] args) {
Phone xiaoMi = new Phone();
xiaoMi.call();
}
}
话单文件自己制作即可
121 | 122 | 1 | 2022-03-10 14:50:42 121 | 123 | 1 | 2022-03-10 14:50:53 121 | 124 | 3 | 2022-03-10 14:51:10 121 | 125 | 7 | 2022-03-10 14:51:27 121 | 126 | 3 | 2022-03-10 14:51:47 这是样式案例



