我无法在 Java 程序中检索 “db2 list db directory”
命令的输出。基本上,我想做的是:-
- 组合框填充了本地系统中的 db2 实例
- 用户从组合框中选择特定实例
- 运行一个新进程来列出该实例的数据库
- 将数据库显示为另一个组合框
这是我完成的代码:-
// dbinstances is a Combo box (Eclipse SWT widget)
this.dbInstances.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
// get selected instance name
String instance = dbInstances.getText();
// command invokes db2 command window, sets current instance and issues list db command
String command = "db2cmd /c \"set DB2INSTANCE="+instance+" & db2 list db directory\"";
// execute command and read output
try{
Process p = Runtime.getRuntime().exec(command);
BufferedReader br= new BufferedReader(new InputStreamReader(p.getInputStream()));
String op = null;
while((op=br.readLine())!=null){
System.out.println(op);
}
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
public void widgetDefaultSelected(SelectionEvent arg0) {}
});
问题是命令执行时,我无法检索输出。窗口只是打开和关闭。
我尝试的一个解决方案是将输出重定向到临时文件并读取它。它可以工作,但效率很低,因为每次用户选择实例时都会运行这段代码。
我在 Windows XP SP3 机器上运行 DB2 9.7 Enterprise 版本。
关于如何检索 Java 程序中的输出有什么想法吗?
提前非常感谢。
最佳答案
您还可以通过 JNI 使用 DB2 API 来检索数据库列表目录。您必须开始扫描,获取条目,然后关闭扫描。
通过这样做,您可以以更好的方式控制数据库列表,从而解析可能因多种原因而变化的输出(HADR、身份验证机制、本地或远程、有或没有别名、IP 地址或服务器名称、服务名称或端口号,在 Linux(主目录)或 Windows(驱动器号)中,以及其他内容) DB2 API 在所有平台上都是相同的,因此它几乎是平台无关的,您只需要知道加载哪个库(.so 或 .dll)即可,其余的都是相同的。欲了解更多信息,请查看: db2DbDirOpenScan http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001509.html db2DbDirGetNextEntry http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001492.html db2DbDirCloseScan http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001437.html
关于java - 如何从 Java 程序中检索 db2 命令输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9579817/