调用windows系统下的cmd命令窗口处理文件

从后缀名为grib2的文件中查询相关的信息,并将查出来的信息保存起来。

主要是学习java中调用windows下的cmd平台,并进行执行相关的命令。

package com.wis.wgrib2;

import java.io.IOException;

/**
 * @description 主函数
 * @author wis
 *
 */
public class WgriB2Main {

    public static void main(String[] args) throws IOException, InterruptedException {
        new WgriB2CMD().executeCMDfile(new WgriB2FIle().fileList());
        System.out.println("------------------------执行完成---------------------");
    }

}
package com.wis.wgrib2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 * @description 在控制台进行执行
 * @author wis
 *
 */
public class WgriB2CMD {

    /**
     * @description 在windows控制台执行命令
     * @param list
     *            文件路径的集合
     */
    public void executeCMDfile(List<String> list) {
        // D:\test\wgrib2_windows\wgrib2.exe
        // D:\test\wgrib2_windows\110010300.gr2 -lon 89.9 38.4 -s|find "TMP"
        File fileS = new File(WgriB2Bean.getOutPath());
        WgriB2FIle wf = new WgriB2FIle();
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        BufferedWriter wr = null;

        try {
            for (String fileNamePath : list) {
                System.out.println(fileNamePath);
                System.out.println(WgriB2Bean.getExePath());
                Process p = new ProcessBuilder(WgriB2Bean.getExePath(), fileNamePath, WgriB2Bean.getVar(),
                        WgriB2Bean.getNx(), WgriB2Bean.getNy(), "-s").start();
                // 等待进程执行完毕,否则会造成死锁。没加这一条的时候,执行了600条左右数据就写不进去了
                p.waitFor();
                is = p.getInputStream();
                isr = new InputStreamReader(is, "utf-8");
                br = new BufferedReader(isr);
                wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileS, true)));
                String line;
                while ((line = br.readLine()) != null) {
                    String lineSuc = "";
                    if (line.indexOf(WgriB2Bean.getBianZhi()) != -1) {
                        // 89.905338,38.399768,-4.24,2011010103
                        // 1:0 : lon=89.905338,lat=38.399768,val=-3.42 : d=2011010104 : TMP:2 m above
                        // ground:anl:
                        String[] lineMao = line.split(":", 5);
                        lineSuc = wf.ziDuanSplit(lineMao);
                        System.out
                                .println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(System.currentTimeMillis())
                                        + " " + "正在处理的文件为: " + new File(fileNamePath).getName());
                        wr.write(lineSuc + ",");

                    } else if (line.indexOf(WgriB2Bean.getBianZhi2()) != -1) {
                        // 8:11000501:lon=89.905338,lat=38.399768,val=0:d=2011010104:APCP:surface:anl:
                        String val = wf.jiangShuiVal(line);
                        wr.write(lineSuc + val);
                        wr.newLine();
                    } else if (line.indexOf(WgriB2Bean.getBianZhi2()) == -1
                            && Integer.parseInt(line.substring(0, 1)) == 8) {
                        wr.newLine();
                    }
                }
                wr.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                if (wr != null) {
                    wr.close();
                    wr = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (br != null) {
                    br.close();
                    br = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (isr != null) {
                    isr.close();
                    isr = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (is != null) {
                    is.close();
                    is = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

package com.wis.wgrib2;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;

/**
 * @description 对文件或者是字段的操作方法
 * @author wis
 *
 */
public class WgriB2FIle {

    /**
     * @description 获取文件列表
     * @return 文件路径的集合
     */
    public List<String> fileList() {
        System.out.println(WgriB2Bean.getFilePath());
        File file = new File(WgriB2Bean.getFilePath());
        List<String> list = new LinkedList<String>();
        if (file.isDirectory()) {

            System.out.println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(System.currentTimeMillis()) + " "
                    + "文件夹路径为: " + file.getPath());
            File[] files = file.listFiles();
            for (File file2 : files) {
                if (file2.getName().indexOf("gr2") != -1) {
                    System.out.println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(System.currentTimeMillis())
                            + " " + "即将处理的文件为: " + file2.getName());
                    if (file2.isFile()) {
                        String fileName = file2.getAbsolutePath();
                        list.add(fileName);
                    }
                } else {
                    System.out.println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(System.currentTimeMillis())
                            + " " + "此文件不能进行处理:" + file2.getName());
                }
            }
        }
        return list;
    }

    /**
     * @description 将用冒号“:”切割出来的字段,继续再进行用逗号“,”切割,然后再组合起来(分隔符为逗号,)。原始字段
     *              1:0:lon=89.798607,lat=38.397492,val=266.208:d=2011010103:TMP:2 m
     *              above ground:anl:
     * @param lineMao
     *            完整字段1:0:lon=89.905338,lat=38.399768,val=269.73:d=2011010104:TMP:2
     *            m above ground:anl:中 的[1 0
     *            lon=89.905338,lat=38.399768,val=269.73:d=2011010104 TMP:2 m above
     *            ground:anl:]这个值,很神奇的字符串集合中本身应该使用逗号隔开的,字段解析出来本身也有逗号,尽然没有识别出错。
     * @return 经度、纬度、开尔文和时间戳的值的集合,中间是使用逗号隔开
     */
    public String ziDuanSplit(String[] lineMao) {
        int num = 0;
        String lineSuc = "";
        for (int i = 2; i < (lineMao.length - 1); i++) {
            // lon=89.905338,lat=38.399768,val=-3.42
            String[] lineDengS = lineMao[i].split(",", -1);
            for (int y = 0; y < lineDengS.length; y++) {
                String lineDengSO = lineDengS[y].substring(lineDengS[y].indexOf("=") + 1);
                if (y == 2) {
                    // 取出开尔文,并转化成摄氏温度
                    lineDengSO = String.format("%.2f", (Double.parseDouble(lineDengSO) - 273.15));
                }
                num++;
                if (num < 5) {
                    lineSuc = lineSuc.trim() + lineDengSO.trim();
                    if (num < 4) {
                        lineSuc = lineSuc.trim() + ",";
                    }
                }
            }
        }
        return lineSuc;
    }

    /**
     * @description 变量值后面字段的提取(包含变量名的提取)
     * @param lineMao
     *            经度、纬度、开尔文和时间戳的集合
     * @return 经度、纬度、开尔文和时间戳的值的集合
     */
    public String ziDuanHou(String[] lineMao) {
        String bian2 = "";
        // APCP:surface:anl:
        for (int i = 0; i < (lineMao.length - 1); i++) {
            bian2 = bian2 + lineMao[i];
            if (i < (lineMao.length - 2)) {
                bian2 = bian2 + ",";
            }
        }
        return bian2;
    }

    /**
     * @description 降水值的提取
     * @param line
     *            完整的字段
     * @return 降水的值
     */
    public String jiangShuiVal(String line) {
        return line.substring(line.indexOf("val=") + 4, line.indexOf(":d="));
    }

}

 

package com.wis.wgrib2;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Properties;

/**
 * @description bean文件
 * @author wis
 *
 */
public class WgriB2Bean {

    private static Properties prop = null;
    private static String filePath = null;
    private static String var = null;
    private static String varX = null;
    private static String nx = null;
    private static String ny = null;
    private static String npts = null;
    private static String bianZhi = null;
    private static String exePath = null;
    private static String outPath = null;
    private static String bianZhi2 = null;
    /**
     * @description 加载配置文件
     */
    static {
        InputStream in = null;
        try {
            // 包内读取
            in = WgriB2FIle.class.getClassLoader().getResourceAsStream("wgrib2.properties");
            // jar包外读取
            // in = new FileInputStream("wgrib2.properties");

            prop = new Properties();
            prop.load(in);
            filePath = prop.getProperty("FILE_PATH");
            var = prop.getProperty("VAR");
            varX = prop.getProperty("VARX");
            nx = prop.getProperty("NX");
            ny = prop.getProperty("NY");
            npts = prop.getProperty("NPTS");
            bianZhi = prop.getProperty("BIANZHI");
            exePath = prop.getProperty("EXT_PATH");
            outPath = prop.getProperty("OUT_PATH");
            bianZhi2 = prop.getProperty("BIANZHI_2");

            // System.out.println("=============================" + nx);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null)
                    in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(System.currentTimeMillis()) + " "
                    + "属性文件加载完成,开始数据处理");
        }
    }

    public static Properties getProp() {
        return prop;
    }

    public static void setProp(Properties prop) {
        WgriB2Bean.prop = prop;
    }

    public static String getFilePath() {
        return filePath;
    }

    public static void setFilePath(String filePath) {
        WgriB2Bean.filePath = filePath;
    }

    public static String getVar() {
        return var;
    }

    public static void setVar(String var) {
        WgriB2Bean.var = var;
    }

    public static String getVarX() {
        return varX;
    }

    public static void setVarX(String varX) {
        WgriB2Bean.varX = varX;
    }

    public static String getNx() {
        return nx;
    }

    public static void setNx(String nx) {
        WgriB2Bean.nx = nx;
    }

    public static String getNy() {
        return ny;
    }

    public static void setNy(String ny) {
        WgriB2Bean.ny = ny;
    }

    public static String getNpts() {
        return npts;
    }

    public static void setNpts(String npts) {
        WgriB2Bean.npts = npts;
    }

    public static String getBianZhi() {
        return bianZhi;
    }

    public static void setBianZhi(String bianZhi) {
        WgriB2Bean.bianZhi = bianZhi;
    }

    public static String getExePath() {
        return exePath;
    }

    public static void setExePath(String exePath) {
        WgriB2Bean.exePath = exePath;
    }

    public static String getOutPath() {
        return outPath;
    }

    public static void setOutPath(String outPath) {
        WgriB2Bean.outPath = outPath;
    }

    public static String getBianZhi2() {
        return bianZhi2;
    }

    public static void setBianZhi2(String bianZhi2) {
        WgriB2Bean.bianZhi2 = bianZhi2;
    }

}
FILE_PATH=D:/wgrib2_test/test/2011
EXT_PATH=d:/LAPS1KM20112013/run/jar2011q/exe/wgrib2.exe
VAR=-lon
VARX=
#文件格式支持txt和csv的
OUT_PATH=D:/test/2013hbu.csv
NPTS=
BIANZHI=TMP
BIANZHI_2=APCP
#xx县101.002080000,37.0347970000
NX=101.002080000
NY=37.0347970000

 

posted @ 2018-07-20 11:21  NLBSN  阅读(788)  评论(0编辑  收藏  举报