在Java中输出手机号看似是一个基础操作,但涉及数据格式化、安全性处理、业务场景适配等多个层面,本文将从基础输出、格式化处理、安全脱敏、异常处理及实际应用场景五个方面,系统介绍如何用Java规范、安全地输出手机号。

基础输出:直接打印字符串
最简单的手机号输出方式是直接使用System.out.println()打印字符串常量或变量,这种方式适用于无需任何格式化的场景,例如调试日志或临时测试。
public class BasicOutput {
public static void main(String[] args) {
String phoneNumber = "13812345678";
System.out.println(phoneNumber); // 直接输出原始手机号
}
}
注意事项:直接输出原始手机号可能存在隐私泄露风险,仅建议在开发调试阶段使用,生产环境需结合后续的安全措施。
格式化输出:增强可读性
实际业务中,手机号常需要分段显示(如138-1234-5678)或隐藏部分位数,Java提供了多种格式化工具:

- 使用
String.format()
通过格式化字符串实现分段显示:String phoneNumber = "13812345678"; String formatted = String.format("%s-%s-%s", phoneNumber.substring(0, 3), phoneNumber.substring(3, 7), phoneNumber.substring(7)); System.out.println(formatted); // 输出:138-1234-5678 - 使用
DecimalFormat
适用于数字型手机号(需先转换为Long):Long phoneNum = 13812345678L; DecimalFormat df = new DecimalFormat("000-0000-0000"); System.out.println(df.format(phoneNum)); // 输出:138-1234-5678 - 使用正则表达式
动态匹配并格式化手机号,适配不同运营商号段:String phoneNumber = "13912345678"; String regex = "(\\d{3})(\\d{4})(\\d{4})"; System.out.println(phoneNumber.replaceAll(regex, "$1-$2-$3"));
安全脱敏:保护用户隐私
在日志、报表或前端展示中,手机号通常需要隐藏中间4位,以下是常见脱敏方法:
- 手动截取拼接
String phoneNumber = "13812345678"; String masked = phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7); System.out.println(masked); // 输出:138****5678
- 使用
StringBuffer或StringBuilder
适用于循环处理批量数据:StringBuilder sb = new StringBuilder(phoneNumber); sb.replace(3, 7, "****"); System.out.println(sb.toString());
- 工具类封装
推荐将脱敏逻辑封装为工具方法,提高代码复用性:public class PhoneUtils { public static String maskPhone(String phone) { if (phone == null || phone.length() != 11) return phone; return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); } }
异常处理:增强代码健壮性
手机号输出前需验证格式合法性,避免因非法输入导致程序异常:
- 正则表达式验证
public static boolean isValidPhone(String phone) { return phone != null && phone.matches("^1[3-9]\\d{9}$"); } - 完整输出流程示例
public class SafeOutput { public static void main(String[] args) { String phoneNumber = "13812345678"; if (!isValidPhone(phoneNumber)) { System.out.println("手机号格式不正确"); return; } System.out.println(PhoneUtils.maskPhone(phoneNumber)); } }
实际应用场景
- 用户信息展示
在用户中心页面,需同时支持原始脱敏和完整显示(如用户主动验证后):// 前端展示脱敏手机号 String displayPhone = PhoneUtils.maskPhone(user.getPhone()); // 后台日志记录完整手机号(加密存储) log.info("用户手机号: " + encryptPhone(user.getPhone())); - 短信发送记录
需要记录发送状态和脱敏后的手机号:String logContent = String.format("向%s发送短信成功,状态:%s", PhoneUtils.maskPhone(phone), sendStatus); - 批量数据处理
使用Java 8 Stream API批量处理手机号列表:List<String> phoneList = Arrays.asList("13812345678", "13987654321"); phoneList.stream() .map(PhoneUtils::maskPhone) .forEach(System.out::println);
进阶技巧
- 国际化支持
不同国家/地区的手机号格式不同,可通过Locale适配:String usPhone = "+1 (650) 123-4567"; MessageFormat mf = new MessageFormat("{0, number, ###-###-####}", Locale.US); System.out.println(mf.format(new Object[]{Long.parseLong(usPhone.replaceAll("[^0-9]", "")})}); - 性能优化
对于高频调用的脱敏方法,使用Pattern预编译正则表达式:private static final Pattern PHONE_PATTERN = Pattern.compile("(\\d{3})\\d{4}(\\d{4})"); public static String fastMask(String phone) { Matcher m = PHONE_PATTERN.matcher(phone); return m.replaceAll("$1****$2"); }
Java中输出手机号的核心在于平衡“功能性”与“安全性”,基础输出适合调试场景,格式化处理提升用户体验,安全脱敏保护隐私,异常处理保障程序稳定,实际开发中,应根据业务需求选择合适的技术方案,并建议将手机号相关操作封装为工具类,遵循“最小暴露原则”避免敏感信息泄露,通过上述方法的组合应用,可以构建出既规范又安全的手机号输出体系。
















