【问题标题】:Windows port required需要 Windows 端口
【发布时间】:2010-07-16 08:32:32
【问题描述】:

我正在尝试将一段用 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";
    //and String cmd = "netstat -a | find /c \"9000\""; 进程 FindConns = Runtime.getRuntime().exec(cmd);

但它失败了。似乎,在调试时,Windows 搞砸了 | (管道)字符。由于以下工作正常。

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

谢谢。

【问题讨论】:

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

标签: java windows shell


【解决方案1】:

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

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

编辑:(如果不清楚)

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

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

【讨论】:

    【解决方案2】:

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

    (您最好单独提出这个问题)。

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


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

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


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

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

    • 你的代码有一个类型是通用接口的字段;在启动时,您的程序从配置文件中读取适当类的名称,使用Class.forName() 或类似的东西实例化该类的对象,将该对象分配给该字段,然后使用该实例上的方法进行任何配置-具体的事情需要做。

    • 1234563和一个 jar 文件,其中包含与配置相关的内容。然后,当您的程序运行时,它可以在其类路径中搜索任何候选类(可能通过对Class.forName() 进行反复试验),然后它的工作方式与其他机制类似。

    编辑

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

    在Java程序占用无限大内存的情况下,何必担心几个字节的多余代码呢?如果您真的只想编写两种替代方法来执行与系统相关的命令,那么请为每种方法编写单独的方法:

    private void windowsProcess();
    private void linuxProcess();
    

    ...然后调用任何一个合适的:

    public void independentProcess() {
        if (runningOnWindows()) {
            windowsProcess();
        } else {
            linuxProcess();
        }
    }
    

    ...然后就完成它。

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

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 2015-08-05
      • 2021-10-02
      • 1970-01-01
      • 2023-03-03
      • 2022-12-12
      • 2015-08-17
      • 2015-04-04
      • 2019-05-13
      相关资源
      最近更新 更多