从后缀名为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: estwgrib2_windowswgrib2.exe // D: estwgrib2_windows110010300.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