Я пытаюсь создать поток, который держит инструмент командной строки netsh windows открытым, чтобы я мог выполнять команды netsh, не открывая его каждый раз.
Дело в том, что после того, как я создал поток, работает только первый командный вызов ... последующие вызовы, похоже, не действуют.
Вот мой код:
public class NetshThread implements Runnable{
private static Process netshProcess = null;
private static BufferedInputStream netshInStream = null;
private static BufferedOutputStream netshOutStream = null;
public BufferedReader inPipe = null;
public void run(){
startNetsh();
}
public void startNetsh(){
try {
netshProcess = Runtime.getRuntime().exec("netsh");
netshInStream = new BufferedInputStream(netshProcess.getInputStream());
netshOutStream = new BufferedOutputStream(netshProcess.getOutputStream());
inPipe = new BufferedReader(new InputStreamReader(netshInStream));
} catch (IOException e) {
e.printStackTrace();
}
}
public void executeCommand(String command){
System.out.println("Executing: " + command);
try {
String str = "";
netshOutStream.write(command.getBytes());
netshOutStream.close();
while ((str = inPipe.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void closeNetsh(){
executeCommand("exit");
}
public static void main(String[] args){
NetshThread nthread = new NetshThread();
nthread.run();
String command = "int ip set address " +
"\"Local Area Connection 6\" static .69.69.69 255.255.255.0";
nthread.executeCommand(command);
command = "int ip set address " +
"\"Local Area Connection 6\" static 69.69.69.69 255.255.255.0";
nthread.executeCommand(command);
System.out.println("*** DONE ***");
}
}
Спасибо !!! =)
Обновление 1:
Хорошо ... Теперь я использую PrintWriter ... так что я думаю, что мне больше не нужно ничего сбрасывать, поскольку конструктор:
новый PrintWriter (netshOutStream, true); (как сказал мне мистер Шини) ...
Предположим, я решил разорвать цикл while, когда первая строка вывода доступна ... Я тоже не работаю ... Следующая команда не будет выполнена .... Мой код теперь выглядит так:
import java.io.*;
public class NetshThread implements Runnable{
private static Process netshProcess = null;
private static BufferedInputStream netshInStream = null;
private static BufferedOutputStream netshOutStream = null;
public BufferedReader inPipe = null;
private PrintWriter netshWriter = null;
public void run(){
startNetsh();
}
public void startNetsh(){
try {
netshProcess = Runtime.getRuntime().exec("netsh");
netshInStream = new BufferedInputStream(netshProcess.getInputStream());
netshOutStream = new BufferedOutputStream(netshProcess.getOutputStream());
netshWriter = new PrintWriter(netshOutStream, true);
inPipe = new BufferedReader(new InputStreamReader(netshInStream));
} catch (IOException e) {
e.printStackTrace();
}
}
public void executeCommand(String command){
System.out.println("Executing: " + command);
try {
String str = "";
netshWriter.println(command);
while ((str = inPipe.readLine()) != null) {
System.out.println(str);
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void closeNetsh(){
executeCommand("exit");
}
public static void main(String[] args){
NetshThread nthread = new NetshThread();
Thread xs = new Thread(nthread);
xs.run();
String command = "int ip set address " +
"\"Local Area Connection 6\" static .69.69.69 255.255.255.0";
nthread.executeCommand(command);
command = "int ip set address " +
"\"Local Area Connection 6\" static 69.69.69.69 255.255.255.0";
nthread.executeCommand(command);
System.out.println("*** DONE ***");
}
}
и вывод, который я получаю:
Выполнение: int ip set address "Local
Площадь подключения 6 "статическая .69.69.69
255.255.255.0 netsh> .69.69.69 не является допустимым значением для addr.
Выполнение: int ip установить адрес "Local
Площадь подключения 6 "статический 69.69.69.69
Почему вторая команда не выполняется ???
255.255.255.0
* СОВЕРШЕНО *
Обновление 2:
Казалось, все работало очень хорошо, пока учитель не попробовал мое приложение в среде испанских окон ....
мой код выглядит так:
Scanner fi = новый сканер (netshProcess.getInputStream ());
public void executeCommand(String command) {
System.out.println("Executing: " + command);
String str = "";
netshWriter.println(command);
fi.skip("\\s*");
str = fi.nextLine();
System.out.println(str);
}
и мне нужно как-то установить для кодировки netshWriter значение по умолчанию для окон.
Кто-нибудь может знать, кому это делать?