• 通过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 +命令,也可以直接执行命令。我是参照下面这篇文章加上的

    http://wenku.baidu.com/view/6e80a982e53a580216fcfea4.html

  • 相关阅读:
    科大奥瑞大物实验-A类不确定度计算器 代码
    在手机和电脑间双向加密传输文件 —— Windows 安装 Kde Connect
    Leetcode 寻找两个有序数组的中位数
    树莓派3B安装 Arch Linux ARM
    从零开始编译安装 Extcalc
    Oracle, PostgreSQl, MySQL针对INSERT时可能唯一键重复的SQL
    如何从Oracle, MySql, PostgreSQL的PreparedStatement获得所执行的sql语句?
    PostgreSQL报错:当前事务被终止,命令被忽略,直到事务块结束
    PostgreSQL对GROUP BY子句使用常量的特殊限制
    一种用JDBC实现批量查询的巧妙方法
  • 原文地址:https://www.cnblogs.com/yuwenfeng/p/3264810.html
Copyright © 2020-2023  润新知