Java Loop InputStream直到boolean = false

时间:2018-01-20 00:06:34

标签: java boolean inputstream stringbuilder tasklist

我有这个输入流来检查我是否打开了某个CAD文件。我这样做是通过使用输入流来运行具有我想要检查的名称的tasklist命令。我目前有一个布尔值,如果特定的CAD文件没有打开,则返回true。如果CAD文件已打开,则返回false。但是,我希望它能够循环这个直到CAD文件打开,因为到目前为止我必须继续运行它才能使它工作。我还需要能够从一个单独的类中检查这个布尔值。我现在在主要的它,所以我可以测试它。我的代码看起来像这样......

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();
}
}

我的另一堂课将会有一个“如果声明”。检查我的布尔值"逻辑"是假的,如果是的话,打印一些东西。我已经尝试了我能想到的每一种可能的方法,但我无法按照我想要的方式运行它。我发现涉及循环输入流的所有其他事情并不适用于我的情况。所以希望有人可以帮助我实现我想做的事情。

2 个答案:

答案 0 :(得分:1)

我首先将所有内容从主要内容移到另一个类中。这将使检索值和调用特定函数更容易。然后在main中创建该类的对象。完成后,我将为布尔变量创建一个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){

        //}
    //}
}
}

其他课程

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;
}
}

答案 1 :(得分:0)

  

我的另一个类将有一个if语句来检查我的布尔logical是否为假...

嗯,logical是方法中的局部变量。因此,另一个类中的代码无法看到它。

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

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

  • 将您的代码放入返回您分配给logical的值的方法中。

从设计角度来看,第二种方法更可取......因为它减少了相对于第一种方法的耦合。但如果你的申请很少,那就不重要了。

我可以看到您的代码存在其他一些重大问题。

  1. 使用exec(String)时,您依靠exec方法将命令字符串拆分为命令名和参数。不幸的是,exec不理解(OS / shell /具体的)引用规则,等命令中的等等。所以它会搞乱你引用的字符串。你需要自己分裂;就像这样:

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

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