Java研究 -- Jdk获取本地计算机名称的一个Bug

    通过Java1.6的jdk获取中文计算机名称时,存在一个bug。

 

前提条件

 

  • 运行程序的计算机名称中含有中文,如:中文名称_ENGLISH
  • 运行程序的计算机ip为10.36.24.17

 

 

代码如下:

 

public class NetAddress {
 
	public static void println(String s, InetAddress address){
	 
		String sName = address.getHostName();
		String sIp = address.getHostAddress();
		System.out.println(s + "_" + sName + "_" + sIp);
		System.out.println("名称byte数组:" + Arrays.toString(sName.getBytes()));
	}
	
	public static void main(String[] args) throws UnknownHostException{
//		NetAddress n = new NetAddress();
//		n.show2();
		
		// 本地
		InetAddress address1 = InetAddress.getLocalHost();
		println("local", address1);
		
		// 
		InetAddress address2 = InetAddress.getByName("10.36.24.17");;
		println("getByName", address2);
 
		InetAddress address3 = InetAddress.getByName("127.0.0.1");;
		println("127.0.0.1", address3);
		
		InetAddress address4 = InetAddress.getByName("");;
		println("空", address4);
	 
	}
	
}

以上程序,通过4种方法获取计算机的信息,并分别打印计算机的名称和IP,同时把计算机名称byte字节流也逐一打印出来。

 

执行程序,打印信息如下:

 

local_????????_ENGLIS_10.36.24.17
名称byte数组:[63, 63, 63, 63, 63, 63, 63, 63, 95, 69, 78, 71, 76, 73, 83]

getByName_中文名称_ENGLISH_10.36.24.17
名称byte数组:[-42, -48, -50, -60, -61, -5, -77, -58, 95, 69, 78, 71, 76, 73, 83, 72]

127.0.0.1_localhost_127.0.0.1
名称byte数组:[108, 111, 99, 97, 108, 104, 111, 115, 116]

空_localhost_127.0.0.1
名称byte数组:[108, 111, 99, 97, 108, 104, 111, 115, 116]

 

结论: 

 

从打印信息可以看出:

 

  • InetAddress.getLocalHost() 获取的信息,如果计算机名称为中文,则会出现问题。因为名称字节流无论中、英文都用1个字节表示,自然会出现乱码。
  • InetAddress.getByName("10.36.24.17")获取的信息,无论计算机是中文还是英文都是正确的。因为名称此字节流中使用2个字节表示中文,1个字节表示英文。
  • InetAddress.getByName("127.0.0.1") 和 InetAddress.getByName("")获取的计算机名称都是“localhost

 

 bug无处不在,没想到JDK自带类也存在bug

 

你可能感兴趣的:(java)