Java 需要Windows端口

Java 需要Windows端口,java,windows,shell,Java,Windows,Shell,我正在尝试将一段用Java编写的代码(见下文)从Linux移植到Windows,并在某一点上进行了修改 String sh = "/bin/sh"; String cop = "-c"; String cmd = "netstat -a | grep 9000 | wc -l"; String[] exe = new String[] {sh, cop, cmd};

我正在尝试将一段用Java编写的代码(见下文)从Linux移植到Windows,并在某一点上进行了修改

                String sh = "/bin/sh";
                String cop = "-c";
                String cmd = "netstat -a | grep 9000 | wc -l";
                String[] exe = new String[] {sh, cop, cmd};
                Process FindConns = Runtime.getRuntime().exec(exe);
这实际上构建了一个命令并将其传递给shell执行并收集结果。
现在在Windows中,等效的命令是

netstat -a | find /c "9000"
但是,我不确定以下几点:-

  • 对于Windows端口,应将什么命令字符串传递给“Runtime.getRuntime().exec()”。我试过了

    String cmd=“netstat-a | find/c 9000”
    //和字符串cmd=“netstat-a | find/c\“9000\”; Process FindConns=Runtime.getRuntime().exec(cmd)

但它失败了。在调试时,Windows似乎在|(管道)字符处出错。因为下面的工作正常

String cmd = "netstat -a";
Process FindConns = Runtime.getRuntime().exec(cmd);
  • 其次,(对于java编程来说是新手)在java中进行条件编译(如#ifdef WIN32等)的最佳方式是什么

谢谢。

这个
|
实际上是由命令行解释器处理的,没有其他程序知道该怎么做

如果要在Windows中处理命令行(包含重定向之类的内容),应将该行作为参数传递给
cmd/c
。过去我在这方面做得相当成功

编辑:(如果不清楚)

exec()运行一个程序,它不会显式调用命令行解释器(cmd.exe)来执行此操作


您需要执行的程序是
cmd.exe
,所有其他内容都需要作为命令行传递给它。我不太确定是否需要将参数作为单个字符串,或者它们应该分开。。。试试看

作为一个单独的答案:相当于Java中的条件编译

(你最好把这个问题作为一个单独的问题来问)

您可能知道,Java并没有真正的条件编译,当然不是C的预处理器


在某些情况下,很容易将每个编码方案放入由常量、err、
静态final
字段控制的
if
块中。如果可以在编译时对这些字段求值,使它们的值实际上是常量,那么编译器就足够聪明,可以完全删除受其控制的
If
块中的代码。但是,这些块中的代码仍然是编译的(与预处理器不同),并接受语法检查。我有时会发现,常量注释掉的代码使用的
#import
被声明为未使用(在我的Eclipse IDE中),这让我很恼火,但是如果我省略了
#import
,那么如果我更改常量,我的编码就会不正确

请注意,这个“常量”可以在单独的类中定义,因此更改“配置”可以通过更改单个文件中的值来完成


对您的问题的更高层次的回答包括运行时配置、依赖项注入之类的。基本思想是将依赖于系统的代码包含在单独的类中(每个目标系统一个),所有这些类都实现相同的接口

在运行时,我们会想到两种不同的机制来选择正确的代码:

  • 您的代码有一个字段,其类型与公共接口的类型相同;在启动时,您的程序从配置文件中读取相应类的名称,使用
    class.forName()
    或类似的方法实例化该类的对象,将该对象分配给字段,然后使用该实例上的方法执行任何特定于配置的操作

  • 如果您将程序部署为
    Jar
    文件,则可以创建包含每个配置相关类的单独Jar文件,并且在部署程序时,可以部署一个“主”Jar文件和一个包含配置相关内容的Jar文件。然后,当您的程序运行时,它可以在其类路径中搜索任何候选类(可能通过使用
    Class.forName()
    )进行反复试验),然后它的工作方式与其他机制类似


编辑

想到这一点,我想到了一个“禅宗元答案”:

在Java程序所占用的贪吃的无限内存中,为什么要担心几个字节的多余代码呢?如果您真的只想编写两种替代方法来执行依赖于系统的命令,那么请检查、编码并为每种方法编译单独的方法:

private void windowsProcess();
private void linuxProcess();
…然后打电话给合适的人:

public void independentProcess() {
    if (runningOnWindows()) {
        windowsProcess();
    } else {
        linuxProcess();
    }
}
…就这样吧


单独的JAR、运行时解析等等都是旨在交换代码机器的重要部分、整个库的解决方案。。。如果只有几百行左右,我个人不会担心程序中未使用的代码。Java不喜欢对小内存甚至中内存量过于挑剔。每个对象的内存开销是多少?16字节?32?

不要在一个问题中问两个不相关的问题。你现在应该知道了!第二部分是相关的。我需要进行移植,并将使用第二部分来实现第一部分。