Java 爪哇及;Windows 7:可靠获取IPv4网络掩码?

Java 爪哇及;Windows 7:可靠获取IPv4网络掩码?,java,windows-7,netmask,Java,Windows 7,Netmask,我在Windows上遇到了一个已知的Java 6错误。我的理解是,获取网络掩码的正常方法是查找网络前缀长度并进行一些位移位。问题是,在Windows上,前缀长度经常返回错误,因此当我们应该得到24或20时,我们得到128 在中,建议将-Djava.net.preferIPv4Stack=true放在Java命令行上。不幸的是,在Windows7上,将其作为VM参数或Java命令行添加似乎没有效果 (a) 有人知道这个问题的其他解决方法吗?这些方法可能在Windows7上仍然有效 (b) 或者,是

我在Windows上遇到了一个已知的Java 6错误。我的理解是,获取网络掩码的正常方法是查找网络前缀长度并进行一些位移位。问题是,在Windows上,前缀长度经常返回错误,因此当我们应该得到24或20时,我们得到128

在中,建议将
-Djava.net.preferIPv4Stack=true
放在Java命令行上。不幸的是,在Windows7上,将其作为VM参数或Java命令行添加似乎没有效果

(a) 有人知道这个问题的其他解决方法吗?这些方法可能在Windows7上仍然有效

(b) 或者,是否有一种完全不同的方法来获得可靠的网络掩码

谢谢


另外,既然问题只存在于Windows 7中,为什么不寻找特定于操作系统的解决方案呢?
我知道我们可以从Java启动windows程序,包括windows命令行或bat文件。必须有一种方法将ipconfig的输出重新定向到windows中的文本文件。您的程序应该能够通过调用ipconfig然后读取输出来获取子网掩码。

下面的代码显示子网掩码。在具有多个网络连接的计算机上(如具有无线和Cat-5以太网连接的笔记本电脑),它可能会写入两次子网掩码,因为客户端可能有两个不同的IP地址

    String os = System.getProperty("os.name");        
    try {
        if(os.indexOf("Windows 7")>=0) {
            Process process = Runtime.getRuntime().exec("ipconfig");
            process.waitFor();
            InputStream commandOut= process.getInputStream();

            BufferedReader in = new BufferedReader(new InputStreamReader(commandOut));
            String line;
            while((line = in.readLine()) !=null) {
                if(line.indexOf("Subnet Mask")>=0) {
                    int colon = line.indexOf(":");
                    System.out.println(line.substring(colon+2));
                }
            }
        }
    catch(IOException ioe) {    }
    catch(java.lang.InterruptedException utoh) {   }
在有线和无线连接都处于活动状态的笔记本电脑上,我得到以下输出: 255.255.254.0 255.255.254.0


当我关闭无线连接时,我只看到有线以太网链路的一行输出,正如预期的那样。
-Djava.net.preferIPv4Stack=true
VM选项应该在任何操作系统下都能工作。或者,它可以作为
System.setProperty(“Java.net.preferIPv4Stack”,“true”)放入Java代码中。除非有什么东西(图书馆或其他什么东西)正在重置它的真实状态。

正确的礼仪要求我列出我问过这个问题的其他地方:奇怪。。。
-Djava.net.preferIPv4Stack=true
VM选项在我的JRE 1.6版Windows7下确实有效。我将其作为
System.setProperty(“Java.net.preferIPv4Stack”,“true”)
放在Java代码中。除非有什么东西(库或任何东西)正在重置它。你能显示你的IP网络掩码代码吗?谢谢你的代码行。我使用的是Netbeans,这里有一个放置VM选项的地方。我试着把-D放在那里。不行。我还使用Advanced Installer创建的包装器启动应用程序,并且可以放置命令行选项。那也没用。我将尝试你的建议,在我的主要方法的顶部添加这行代码。谢谢@你介意把你的答案贴出来吗?这样我就可以给你赏金了?谢谢。:)嗯,我们在Win7中看到了它,但是Sun bug并没有那么具体。在任何情况下,相同的解决方案都应适用于任何版本的Windows。我必须学习如何检查操作系统类型、启动外部程序并捕获其输出。作为奖励,也许可以使用一些聪明的正则表达式来解析结果(而不是编写自定义代码逐字符解析)。这是一个非常好的答案,尽管上面eee的一条评论给了我一个可移植的答案。现在我被如何处理赏金弄得左右为难。上面的代码是可移植的,因为你可以很容易地编写代码块来处理不同的操作系统版本。如果您只需要Windows 7的此修复程序,那么上面的代码就是您想要的。