【发布时间】:2014-01-23 21:09:39
【问题描述】:
我使用以下两种方法手动运行sqlite3.exe。
如果我在 Windows 命令行中键入“sqlite3.exe test.db”,sqlite3 会进入它的交互式 shell,我可以在其中输入各种命令。
如果我输入第三个 SQL 参数,例如。 'SQLite.exe test.db "SELECT * FROM clients"',sqlite3不交互运行,而是通过stdout输出请求的数据。
我想通过 java 代码与 shell 中的提示进行交互(第一种情况)。
使用以下快速 Java 代码,我可以非交互方式运行 SQLite3.exe(第二种情况)。
char[] readBuffer=new char[1000];
//Third parameter in constructor is the select statement
ProcessBuilder pBuilder=new ProcessBuilder(pathToSQLite3exe, "test.db",
"\"SELECT * FROM clients"\" );
pBuilder.directory(new File(pathToExeFolder));
pBuilder.redirectErrorStream(true);
Process process=pBuilder.start();
InputStreamReader reader=new InputStreamReader(process.getInputStream());
int charCount;
while (true)
{
charCount=reader.read(readBuffer);
if (charCount>0)
{
System.out.print(new String(readBuffer,0,charCount));
}
else
{
break;
}
}
上面的工作按预期工作,但是如果我在 ProcessBuilder 构造函数中省略第三个参数(select 语句),程序会永远暂停,大概是在 reader.read() 语句处,因为没有要读取的字符。我想 sqlite3.exe 确实进入了交互模式,但是输入流不是由 shell 的标准输出提供的。我希望看到交互式提示文本并能够将命令写入输出流。
Java 和 ProcessBuilder 可以做到这一点吗?
谢谢。
【问题讨论】:
标签: java sqlite processbuilder