这是我的代码
try{ String logf = "mysql -p -h localhost ruralcdn<E:\\data\\DBServer\\"+FileName; System.out.println("Command"+logf); Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(logf); int lm = pr.waitFor(); System.out.println("lm"+lm); System.out.println("!!Done!!"); }catch(Exception ex){ System.out.println("!!error!!"); }
当我编译上面的代码,它挂起无限的时间,并没有更新我的数据库中的条目。 当我尝试使用下面给出的方法
Connection conn = dbConnectionSource.getConnection(); Statement stmt = conn.createStatement(); stmt.execute(FileUtils.readFileToString(new File("./some-sql-file")));
控制台显示错误:您的sql syntex中有错误
请帮助我,让我可以正确地做事。
谢谢
你的命令(在logf
)包括标准输入的重定向。 不幸的是,你不能这样做,因为Process.exec(String)
方法不理解如何执行命令重定向,引用和sso。 它只理解如何执行一个用空格分隔的参数的简单命令。
你有两个选择:
您可以使用Java打开文件,并将其写入到过程对象的输出流中,以便显示在命令标准输入中。
您可以告诉Java在shell /命令解释器中运行mysql
命令,以解决重定向等问题。
你的代码应该是这样的:
String[] command = new String{ "cmd", "/c", "mysql -p -h localhost ruralcdn < E:\\data\\DBserver\\" + fileName; ProcessBuilder pb = new ProcessBuilder(command); Process p = pb.start(); p.waitFor();
你的代码应该做的另一件事是读取和显示(或丢弃)命令的标准输出/错误。 如果你不读它:
mysql
命令会被阻塞,因为它不能再写入你没有阅读的管道。 控制台显示错误:您的sql syntex中有错误
这可能是说实话…
顺便说一下, mysql
命令永远挂起的原因是它正在等待Java进程在其标准输入上发送数据。 这不会发生,因为你的Java代码不会写任何东西。