思路(注意:此方法设置的代理,需重启浏览器才可生效)
通过bat脚本设置系统代理,然后在java中调用bat。
实现
1.Java调用bat
当我们需要在java程序中调用外部程序,我们可用通过Runtime.exec()调用来完成。
java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令。
cmd /c dir 是执行完dir命令后关闭命令窗口。 cmd /k dir 是执行完dir命令后不关闭命令窗口。
cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。
cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。
例子:
import java.io.IOException;
import java.io.InputStream;
public class callbat {
public static void main(String args[]){
callCmd("C:/run.bat");
}
public static void callCmd(String locationCmd){
try {
Process child = Runtime.getRuntime().exec(locationCmd);
InputStream in = child.getInputStream();
int c;
while ((c = in.read()) != -1) {
System.out.println((char)c);
}
in.close();
try {
child.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("done");
} catch (IOException e) {
e.printStackTrace();
}
}
}
关于java调用外部程序需要注意的事项
1. 当调用的外部命令中包含重定向(<、>),管道( | ) 命令时,exec(String command)的版本不能正确解析重定向、管道操作符。所以需要使用exec(String [] cmdArray)。
2.永远要在调用waitFor()方法之前读取数据流
永远要先从标准错误流中读取,然后再读取标准输出流
3.在exec()后 立即调用waitFor()会导致进程挂起。
2.bat脚本设置代理
在这里因为要要实现代理的动态变化,所以将bat内容放到了java代码中,每次生成对应的bat,运行,然后删除。如下:
public static boolean setProxy(String ip, String port){
String code = "@echo off\r\n"
+ "set ip=" + ip + "\r\n"
+ "set port=" + port + "\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\\Connections\" /v \"DefaultConnectionSettings\" /t REG_BINARY /d \"3C000000AA0100000B0000000F000000\" /f\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyEnable\" /t REG_DWORD /d \"1\" /f\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyServer\" /t REG_SZ /d \"%ip%:%port%\" /f\r\n"
+ "REG ADD \"HKLM\\System\\CurrentControlSet\\Hardware Profiles\\0001\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyEnable\" /t REG_DWORD /d \"1\" /f\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\\Connections\" /v \"SavedLegacySettings\" /t REG_BINARY /d \"3C000000AE0100000B0000000F000000\" /f\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyOverride\" /t REG_SZ /d \"<local>\" /f\r\n"
+ "set rp=\"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\"\r\n"
+ "set rk=\"ProxyServer\"\r\n"
+ "for /f \"tokens=*\" %%a in ('reg query %rp% /v %rk%^|findstr %rk%') do (\r\n"
+ "call :doit %%a\r\n"
+ ")\r\n"
+ "goto :eof\r\n"
+ ":doit\r\n"
+ "echo %3\r\n"
+ "echo.&echo.\r\n"
+ "exit";
return runBat(code,ip+":"+port);
}
public static void removeProxy(){
String code = "@echo off\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\\Connections\" /v \"DefaultConnectionSettings\" /t REG_BINARY /d \"3C000000AA0100000B0000000F000000\" /f\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyEnable\" /t REG_DWORD /d \"0\" /f\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyServer\" /t REG_SZ /d \"\" /f\r\n"
+ "REG ADD \"HKLM\\System\\CurrentControlSet\\Hardware Profiles\\0001\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyEnable\" /t REG_DWORD /d \"1\" /f\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\\Connections\" /v \"SavedLegacySettings\" /t REG_BINARY /d \"3C000000AE0100000B0000000F000000\" /f\r\n"
+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyOverride\" /t REG_SZ /d \"<local>\" /f\r\n"
+ "exit";
runBat(code,"");
}
private static boolean runBat(String code,String flag){
File file = new File("temp.bat");
String str = "";
try {
if(!file.exists()) file.createNewFile();
PrintWriter pw = new PrintWriter(file);
pw.write(code);
pw.flush();
pw.close();
Process child = Runtime.getRuntime().exec("cmd /c temp.bat");
InputStream in = child.getInputStream();
Scanner sc = new Scanner(in,"gbk");
while(sc.hasNext()){
str += sc.nextLine();
}
try {
child.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
sc.close();
Thread.sleep(1000);
file.delete();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(str.contains(flag)) return true;
else return false;
}
上面包括了删除代理的方法,在最后的时候,检测了是否设置成功,返回对应的结果。
完毕。
文章参考:[批处理]自动设置本机系统代理服务器
如果能帮到你,请右上角点个赞哦。