Java 循环 InputStream 直到 boolean = false

Java Loop InputStream until boolean = false

我有这个输入流来检查我是否打开了某个 CAD 文件。我通过使用输入流来执行此操作 运行 具有我要检查的名称的任务列表命令。我目前有一个布尔值,如果特定 CAD 文件未打开,则 returns 为真。如果 CAD 文件已打开,则 returns 为 false。但是,我希望它能够循环播放直到 CAD 文件打开,因为现在我必须保持 运行ning 它才能正常工作。我还需要能够从单独的 class 检查这个布尔值。我现在把它放在我的主目录中,所以我可以测试它。我的代码看起来像这样...

public class AutoCadCheck {

public static void main(String[] argv) throws Exception {

    String notOpen = "INFO: No tasks are running which match the specified criteria";
    StringBuilder textBuilder = new StringBuilder();
    String command = "tasklist /fi \"windowtitle eq Autodesk AutoCAD 2017 - [123-4567.dwg]";
    int i;

    InputStream myStream = Runtime.getRuntime().exec(command).getInputStream();

    while ((i = myStream.read()) != -1) {
        textBuilder.append((char) i);
    }

    String output = textBuilder.toString();
    boolean logical = output.contains(notOpen);

    if (logical) {
        System.out.println("DWG Not Open");
    } else {
        System.out.print(output);
    }
    myStream.close();
}
}

我的另一个 class 将有一个 'if statement' 检查我的布尔值 "logical" 是否为假,如果是,打印一些东西。我已经尝试了我能想到的所有可能的方法,但我无法让它按照我想要的方式运行。我发现涉及循环输入流的所有其他事情并不真正适用于我的情况。所以希望有人能帮助我实现我想做的事情。

我会首先将所有内容移出 main 并移至另一个 class。这将使检索值和调用特定函数变得更加容易。然后在 main 中创建一个 class 的对象。完成后,我将为布尔变量创建一个 get 方法。现在关注循环。在 main 中创建对象后,在 main 中创建一个条件循环,该循环调用您需要的函数,直到满足不同的条件。打开文件后可能会满足此条件。满足条件后,它退出到另一个依赖于另一个条件(例如用户输入)的循环。

public class AutoCadCheck {

public static void main(String[] argv) throws Exception {
    AutoCadFile file = new AutoCadFile();
    //loop 1 
    //Some conditional so the program will 
    //continue to run after the file has been found.
    // while(){

        //loop 2
        //check to see if the file is open or not
        //while(logical){

        //}
    //}
}
}

其他class

import java.io.IOException;
import java.io.InputStream;

public class AutoCadFile {

private String notOpen;
private StringBuilder textBuilder;
private String command;
private int i;
private InputStream myStream;
private String output;
private boolean logical;

public AutoCadFile() {
    notOpen = "INFO: No tasks are running which match the specified criteria";
    textBuilder = new StringBuilder();
    command = "tasklist /fi \"windowtitle eq Autodesk AutoCAD 2017 - [123-4567.dwg]";
    output = textBuilder.toString();
    logical = output.contains(notOpen);

    try {
        myStream = Runtime.getRuntime().exec(command).getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void checkForFileOpen() {
    try {
        while ((i = myStream.read()) != -1) {
            textBuilder.append((char) i);
        }
        if (logical) {
            System.out.println("DWG Not Open");
        } else {
            System.out.print(output);
        }
        myStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public boolean getFileBoolean() {
    return logical;
}
}

My other class is going to have an if statement that checks whether my boolean logical is false ...

嗯,logical 是方法中的局部变量。所以另一个 class 中的代码将无法看到它。

这种事情有两种常见的做法:

  • 使变量(即logical)成为相关class的字段。 (最好不是 static 字段,因为这会导致其他问题。)

  • 将您的代码放入一个方法中,结果 returns 您要分配给 logical 的值。

从设计的角度来看,第二种方法更可取......因为它相对于第一种减少了耦合。但是,如果您的应用程序很小,那几乎不重要。


我发现您的代码还有其他几个重要问题。

  1. 当您使用 exec(String) 时,您依赖 exec 方法将命令字符串拆分为命令名称和参数。不幸的是,exec 不理解(OS / shell / 任何具体的)命令中的引用规则等。所以它会弄乱你引用的字符串。您需要自己进行拆分;即像这样的东西:

    String[] command = new String{} {
        "tasklist",
        "/fi",
        "windowtitle eq Autodesk AutoCAD 2017 - [123-4567.dwg]"
    };
    
  2. 您的代码可能会泄漏输入流。您应该使用 "try with resource" 来避免这种情况;例如

    try (InputStream myStream = Runtime.getRuntime().exec(command).getInputStream()) {
        // do stuff
    } // the stream is closed automatically ... always