通过JAVA调用命令行程序
这是我在把数据导入到数据库时遇到问题,总结下来的。包含两个方法,一个方法是读取文件路径下的文件列表,主方法是执行cmd命令,在导入时想得到导入一个文件的时间,涉及到线程阻塞问题,这个问题理解不是很深,应该是执行cmd命令时,相当于开启了一个新的线程,如果需要线程执行完再开启新的线程,需要阻塞新线程,用到了WaitFor().
代码如下:
package loadFile; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.util.ArrayList; /**JAVA 调用命令行加载数据到数据库中 * @author ywf * */ public class LoadData { public static void main(String[] args) throws Exception { String path = "D:\\1";// 导入文件路径 ArrayList<File> list = new ArrayList(); getFile(list, path); String UERNAME = "SYSDBA"; String PASSWORD = "szoscar55"; String cmd = "oimpexp -F "; for (File f : list) { long time = System.currentTimeMillis(); String command = cmd + "\"" + f.getPath() + "\"" + " -S SYSDBA -T " + "\"MB_QL\"" + " -B 30 -A 1 -d 1 -H localhost -D OSRDB -p 2003 -U " + UERNAME + " -P " + PASSWORD + " -Y UTF-8"; System.out.println(command); Process pro = Runtime.getRuntime().exec("cmd /c " + command); int a = pro.waitFor(); if (a != 0) { pro.destroy(); } long time1 = System.currentTimeMillis(); System.out.println(f.getName() + "执行结束. 时间为:" + (time1 - time) / 1000 + "s"); } } /** * 文件夹下的文件列表 * @param fileAll * @param path * @throws Exception */ public static void getFile(ArrayList fileAll, String path) throws Exception { File files = new File(path); ArrayList<File> dirs = new ArrayList();// 存储文件夹 // ArrayList <File> fileAll = new ArrayList<File>();//存储文件 dirs.add(files); int index = 0; while (index < dirs.size()) { File file1 = dirs.get(index); if (file1.isDirectory()) { File[] fileList = file1.listFiles(); for (int i = 0; i < fileList.length; i++) { File ff = fileList[i]; if (ff.isFile()) { fileAll.add(ff); } else { dirs.add(ff); } } } else { fileAll.add(file1); } index++; } } }
对cmd命令不是很懂,程序中写的cmd /c +命令,也可以直接执行命令。我是参照下面这篇文章加上的