调用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
调用windows系统下的cmd命令窗口处理文件的更多相关文章
- windows系统下在dos命令行kill掉被占用的pid (转)
原文出自:http://www.2cto.com/os/201304/203771.html windows系统下在dos命令行kill掉被占用的pid 1.开始-->运行-->c ...
- c语言基础学习02_windows系统下的cmd命令
=============================================================================注意:cmd的命令很多,需要用的时候可以查询即 ...
- Windows 系统中的 CMD 黑窗口简单介绍
简介 DOS是磁盘操作系统的缩写,是个人计算机上的一类操作系统DOS命令,是DOS操作系统的命令,是一种面向磁盘的操作命令,主要包括目录操作类命令.磁盘操作类命令.文件操作类命令和其它命令.DOS系统 ...
- WIndows 系统下的常用命令 和 检测方法
### 一.检测硬盘速度(Windows 自带工具) #### 使用windows 系统自带的工具测试硬盘读写速度 > 在使用下面命令前,需要获得管理员权限,才会在Dos窗口上显示(否则,一闪而 ...
- 三种方法在当前目录下打开cmd命令窗口
概述 运行npm的时候,每次都要cd到目录,很麻烦,所以总结了三种在当前目录下直接打开cmd窗口的方法,供以后开发时参考,相信对其他人也有用. 方法一 在当前目录按住shift再右键. 会看到右键菜单 ...
- Windows系统下在Git Bash中把文件内容复制到剪贴板的命令
众所周知,在OS系统中,复制文件内容到剪贴板(比如复制公钥到剪贴板)的命令是: pbcopy < ~/.ssh/id_rsa.pub 在Win7或者Win10下这条命令就没用了.可以这样: cl ...
- Windows 系统下安装 dig 命令
dig是一个Linux下用来DNS查询信息的小工具,dig全称是Domain Information Groper,与nslookup类似,但比nslookup功能更强大.Windows只有nsloo ...
- Windows系统下安装dig命令
dig 是一个 Linux 下用来 DNS 查询信息的工具,全称是Domain Information Groper,与 nslookup 类似,但比 nslookup 功能更强大.Windows 下 ...
- windows系统下使用cd命令
如果要切换到D:\Program Files目录下,大多数人会想当然的在命令行窗口输入 cd D:\Program Files回车. 如下所示: 发现并没有切换到D:\Program Files. 正 ...
随机推荐
- switch,case语句易误区
switch case 语句语法格式如下: switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可 ...
- linux 图解笔记
- 删除ceph集群mds
ceph集群新搭建以后是只有一个默认的存储池rbd的池 ## 创建文件接口集群 1.创建一个元数据池 [root@mytest ~]# ceph osd pool create metadata 20 ...
- C#设计模式-原型模式(Prototype Pattern)
引言 在软件开发过程中,我们习惯使用new来创建对象.但是当我们创建一个实例的过程很昂贵或者很复杂,并且需要创建多个这样的类的实例时.如果仍然用new操作符去创建这样的类的实例,会导致内存中多分配一个 ...
- Boost命令行解释器的简单使用:Boost.Program_options
简介 如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls ls --all -l --color=auto 这里面包含了三种 ...
- js常用函数和事件
1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数:显示一个警告对话框,包括一个OK按钮. (2)confirm函数:显示一个确认对话框,包括OK.Cancel按钮. ...
- Java8 方法引用和构造方法引用
如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言 ...
- Vector和ArrayList的联系和区别
Vector和ArrayList的联系和区别 1.联系: 实用原理相同 功能相同 都是长度可变的数组结构,很多情况下可以互用 2.两者的主要区别:
- Xrepo:一个现代化的跨平台 C/C++ 包管理器
xrepo 是一个基于 Xmake 的跨平台 C/C++ 包管理器. 项目源码 官方文档 它基于 xmake 提供的运行时,但却是一个完整独立的包管理程序,相比 vcpkg/homebrew 此类包管 ...
- P5656 【模板】二元一次不定方程(exgcd)
还不会 exgcd 的请移步窝的学习笔记,这里只讲怎么搞出烦人的答案. 在 \(a,b\) 两者互质的情况下,二元一次不定方程的通解:\(a(x+db)+b(y+da)=c\). 所以要先将 \(a, ...