자바 가 어떻게 플랫폼 을 넘 어 MAC 주 소 를 가 져 오 는 지 상세 하 게 설명 합 니 다.
먼저
Java
의NetworkInterface
류API
를 통 해 본 컴퓨터MAC
의 주 소 를 얻 는 방법 을 소개 하고 코드 를 먼저 보 여 줍 니 다.
/**
* mac v1
*
* @date 2021/5/13
* @author zjw
*/
public class MacUtil {
public static void main(String[] args) {
getMac().forEach(System.out::println);
}
/**
* mac
*
* @return mac
*/
public static List<String> getMac() {
List<String> list = new ArrayList<>();
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
Optional.ofNullable(networkInterface.getHardwareAddress())
.ifPresent(mac -> list.add(format(mac)));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* mac -
*
* @param mac mac
*
* @return mac
*/
private static String format(byte[] mac) {
StringBuilder sb = new StringBuilder();
for (byte b : mac) {
sb.append(String.format("%02X", b)).append("-");
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
}
상기 코드 이론 을 통 해 본 컴퓨터 의 모든MAC
주 소 를 얻 을 수 있 습 니 다.그 밖 에format
방법 을 통 해 얻 은MAC
주 소 를XX-XX-XX-XX-XX-XX
형식 으로 통일 적 으로 처리 할 수 있 습 니 다.여기 서 이론 적 으로 제 가 다른 사람의 사과 컴퓨터 에서 실 행 했 기 때 문 입 니 다.결 과 는 모든MAC
주소(실행ifconfig -a
가 받 은 모든MAC
주 소 를 얻 지 못 했 고llw0
이 네트워크 의MAC
주소 가 계속 바 뀌 었 다.그러나 내 가 로 컬 가상 컴퓨터 에서 애플 을 실행 할 때 도 정상 이 었 다.내 가 애플 컴퓨터 가 없 었 기 때문에 구체 적 인 원인 도 아직 밝 혀 지지 않 았 다.혹시 아 시 는 분 있 으 시 면 댓 글 환영 합 니 다.미리 감 사 드 립 니 다~~~명령 행 가 져 오기
상기 부분 에서 언급 한 바 와 같이 어떤 상황 에서
NetworkInterface
클래스 를 사용 하면 본 컴퓨터 의 모든MAC
주 소 를 얻 을 수 없고 심지어 동적 변화 가 발생 할 수도 있다(잠시 원인 을 알 수 없다).따라서 이런 상황 에서Java
의Runtime
류exec
방법 으로 명령 을 직접 집행 할 수 밖 에 없다.물론 대부분의 경우NetworkInterface
류 를 사용 하 는 것 이 편리 할 뿐만 아니 라 만약 에 나중에 위의 bug(bug 라 고 할 수 있 는 지 없 는 지 개인 적 인 문제 인지)를 복원 했다.상기 코드 를 변경 하지 않 으 면 자신 이 명령 을 수행 하 는 효 과 를 얻 을 수 있 습 니 다.그렇게 많은 말 을 했 습 니 다.먼저 자신 이 명령 을 수행 하여 본 컴퓨터 의 모든MAC
주 소 를 얻 으 면 코드 를 직접 보 여 줍 니 다.
/**
* mac v2
*
* @date 2021/5/13
* @author zjw
*/
public class MacUtil {
private static final String WIN_PREFIX = "win";
private static final String OS_NAME_PROPERTY = "os.name";
private static final String WIN_COMMAND = "ipconfig /all";
private static final String UNIX_COMMAND = "/sbin/ifconfig -a";
private static final String MAC_REGEX = "(([a-f0-9]{2}-){5}|([a-f0-9]{2}:){5})[a-f0-9]{2}";
private static final Pattern pattern = Pattern.compile(MAC_REGEX, Pattern.CASE_INSENSITIVE);
public static void main(String[] args) {
getMac().forEach(System.out::println);
}
/**
*
* mac
*
* @return mac
*/
private static List<String> getMac() {
try {
String osName = System.getProperty(OS_NAME_PROPERTY).toLowerCase();
if (osName.startsWith(WIN_PREFIX)) {
return getMacByCommand(WIN_COMMAND);
}
return getMacByCommand(UNIX_COMMAND);
} catch (Exception e) {
e.printStackTrace();
}
return Collections.emptyList();
}
/**
* mac
* mac
*
* @param command
*
* @return mac
*/
private static List<String> getMacByCommand(String command) throws IOException {
List<String> macList = new ArrayList<>();
List<String> strList = execCommand(command);
for (String str : strList) {
Matcher matcher = pattern.matcher(str);
if (matcher.find() && matcher.end() == str.length()) {
macList.add(matcher.group().replace(":", "-").toUpperCase());
}
}
return macList;
}
/**
*
*
* @param command
*
* @return
*/
private static List<String> execCommand(String command) throws IOException {
List<String> strList = new ArrayList<>();
Process process = Runtime.getRuntime().exec(command);
try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
return br.lines().collect(Collectors.toList());
} catch (Exception e) {
e.printStackTrace();
}
process.destroy();
return strList;
}
}
소스 코드 자바 가 어떻게 플랫폼 을 넘 어 MAC 주 소 를 얻 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 크로스 플랫폼 에서 MAC 주 소 를 얻 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.