我有这个输入流来检查我是否打开了某个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();
}
}
我的另一堂课将会有一个“如果声明”。检查我的布尔值"逻辑"是假的,如果是的话,打印一些东西。我已经尝试了我能想到的每一种可能的方法,但我无法按照我想要的方式运行它。我发现涉及循环输入流的所有其他事情并不适用于我的情况。所以希望有人可以帮助我实现我想做的事情。
答案 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
的值的方法中。
从设计角度来看,第二种方法更可取......因为它减少了相对于第一种方法的耦合。但如果你的申请很少,那就不重要了。
我可以看到您的代码存在其他一些重大问题。
使用exec(String)
时,您依靠exec
方法将命令字符串拆分为命令名和参数。不幸的是,exec
不理解(OS / shell /具体的)引用规则,等命令中的等等。所以它会搞乱你引用的字符串。你需要自己分裂;就像这样:
String[] command = new String{} {
"tasklist",
"/fi",
"windowtitle eq Autodesk AutoCAD 2017 - [123-4567.dwg]"
};
您的代码可能会泄漏输入流。您应该使用"尝试使用资源"避免这种情况; e.g。
try (InputStream myStream = Runtime.getRuntime().exec(command).getInputStream()) {
// do stuff
} // the stream is closed automatically ... always