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
的值。
从设计的角度来看,第二种方法更可取......因为它相对于第一种减少了耦合。但是,如果您的应用程序很小,那几乎不重要。
我发现您的代码还有其他几个重要问题。
当您使用 exec(String)
时,您依赖 exec
方法将命令字符串拆分为命令名称和参数。不幸的是,exec
不理解(OS / shell / 任何具体的)命令中的引用规则等。所以它会弄乱你引用的字符串。您需要自己进行拆分;即像这样的东西:
String[] command = new String{} {
"tasklist",
"/fi",
"windowtitle eq Autodesk AutoCAD 2017 - [123-4567.dwg]"
};
您的代码可能会泄漏输入流。您应该使用 "try with resource" 来避免这种情况;例如
try (InputStream myStream = Runtime.getRuntime().exec(command).getInputStream()) {
// do stuff
} // the stream is closed automatically ... always
我有这个输入流来检查我是否打开了某个 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
的值。
从设计的角度来看,第二种方法更可取......因为它相对于第一种减少了耦合。但是,如果您的应用程序很小,那几乎不重要。
我发现您的代码还有其他几个重要问题。
当您使用
exec(String)
时,您依赖exec
方法将命令字符串拆分为命令名称和参数。不幸的是,exec
不理解(OS / shell / 任何具体的)命令中的引用规则等。所以它会弄乱你引用的字符串。您需要自己进行拆分;即像这样的东西:String[] command = new String{} { "tasklist", "/fi", "windowtitle eq Autodesk AutoCAD 2017 - [123-4567.dwg]" };
您的代码可能会泄漏输入流。您应该使用 "try with resource" 来避免这种情况;例如
try (InputStream myStream = Runtime.getRuntime().exec(command).getInputStream()) { // do stuff } // the stream is closed automatically ... always