目标:
已知多个字符串,形如:“64 bytes from 39.156.66.18: icmp_seq=1 ttl=50 time=29.7 ms”
获取 总Ping时间(XX:XX:XX格式),最小时间,最大时间,平均时间,丢包率,已发送个数,已接收个数
示例程序:
import java.util.regex.Matcher;
import java.util.regex.Pattern;private class PingThread extends Thread {// ...// 使用正则表达式匹配,从ping输出中提取特定值private static final Pattern PING_PATTERN = Pattern.compile("time=(\\d+\\.\\d+) ms");private static final Pattern PACKET_LOSS_PATTERN = Pattern.compile("(\\d+)% packet loss");private static final Pattern PACKETS_SENT_PATTERN = Pattern.compile("(\\d+) packets transmitted");private static final Pattern PACKETS_RECEIVED_PATTERN = Pattern.compile("(\\d+) packets received");@Overridepublic void run() {super.run();// ... int packetsSent = 0;int packetsReceived = 0;float packetLoss = 0.0f;long minPingTime = Long.MAX_VALUE;long maxPingTime = Long.MIN_VALUE;long totalPingTime = 0;try {// ... // 读取标准输入流while ((line = successReader.readLine()) != null) {System.out.println("Message: " + line); // 在控制台看一下消息Matcher packetLossMatcher = PACKET_LOSS_PATTERN.matcher(line);if (packetLossMatcher.find()) {packetLoss = Float.parseFloat(packetLossMatcher.group(1));}Matcher packetsSentMatcher = PACKETS_SENT_PATTERN.matcher(line);if (packetsSentMatcher.find()) {packetsSent = Integer.parseInt(packetsSentMatcher.group(1));}Matcher packetsReceivedMatcher = PACKETS_RECEIVED_PATTERN.matcher(line);if (packetsReceivedMatcher.find()) {packetsReceived = Integer.parseInt(packetsReceivedMatcher.group(1));}Matcher pingMatcher = PING_PATTERN.matcher(line);while (pingMatcher.find()) {float pingTime = Float.parseFloat(pingMatcher.group(1));totalPingTime += pingTime;minPingTime = Math.min(minPingTime, (long) pingTime);maxPingTime = Math.max(maxPingTime, (long) pingTime);}// ...}// 计算平均Ping时间float avgPingTime = totalPingTime / (float) packetsReceived;// 如果需要可以把ms值转化为 "XX:XX:XX" 格式.// 例如:String formattedMinPingTime = formatTime(minPingTime);String formattedMaxPingTime = formatTime(maxPingTime);String formattedAvgPingTime = formatTime((long) avgPingTime);// ...} catch (IOException | InterruptedException e) {// 处理异常e.printStackTrace();} finally {// ...}}// ms值转换为"XX:XX:XX"格式private String formatTime(long milliseconds) {long seconds = milliseconds / 1000;long minutes = seconds / 60;long hours = minutes / 60;return String.format("%02d:%02d:%02d", hours, minutes % 60, seconds % 60);}
}