执行cmd并获得结果_用JAVA执行CMD命令备份PG数据库,解决需要口令的问题

最近要用JAVA做一个PostgreSQL的备份功能,没想到遇到一个大坑。

在网上搜索,很快就找到一个用JAVA的Runtime.getRuntime().exec()执行cmd命令来备份的方法。

8bd11f481e42df45fe19990dfef52779.png

执行代码后发现,没有导出对应的SQL文件。我觉得可能是命令有问题,于是我在cmd执行了这条命令,才发现问题所在。

f3136a8ef8d10d4ec39edf245f997c21.png

原来是执行命令后还要输入数据密码的,这就是我说的那个大坑。

我马上就想到再用Runtime.getRuntime()执行一遍密码不就得了?但是结果果然不出所料,报错了。

2b7214874eac8a2acca97236ffb59b66.png

于是又网上查,JAVA怎么执行交互式的cmd命令。让我查到可以获取上一个命令的OutputStream,然后用OutputStream写入密码。

于是把代码改成下面这样:

5428805d300d3741dad8824b95099b5a.png

执行并没有报错,但是还是没有生成对应的SQL文件。

于是继续网上查,结果都找不到JAVA执行cmd备份PostgreSQL怎么来输入密码。

然后我决定转换思路,既然不知道怎么输入密码,那干脆查一下pg_dump免密码导出。果然找到了。那就是在环境变量里加上PGPASSWORD。

ab840474b6cf6fd3957762e2c37d6890.png

然后在cmd窗口执行导出命令,不用输入密码,成功导出。

但在很不幸,代码执行的时候,还是没有生成对应的SQL文件。难道是代码里执行不认这个环境变量?

本以为就一直卡在密码这里过不去了,没想到让我发现了另一个类ProcessBuilder。这个类也能执行cmd命令。于是把Runtime.getRuntime()全部换成ProcessBuilder。然后执行代码。

62087a98422e80d14081347922ccf7c3.png

结果依然是那么的不出所料,没有生成对应的SQL文件。

不过幸好我鼠标多滚了两下,在ProcessBuilder类的API页面。被我看到了一个environment()方法。

6d2b9d8ae008d4e71a8266e820770713.png

就是environment()可以设置环境变量,于是我把刚刚的免密导出环境变量PGPASSWORD用ProcessBuilder类来设置。

013b519a82cbc2dc4afb1f0290c1e869.png

然后执行代码,我对这次执行的结果并没抱多大希望。

但是结果依旧是那么的不出所料

52850540959dbafa5e29482e5a372798.png

导出成功了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值