java调用shell并传参

<p>这段时间项目中出现一个问题---下载服务器(linux)上的xml文件(通过ftp协议),若文件很大(至少3G)加上宽带窄的话就出现下载失败,就是不失败,下载的时间也非常的长</p>
<pre>     老大让解决这个问题.     刚接触到这个问题时迷茫 项目也是刚接触(我是新人)  linux从没碰过 不知道如何下手 ftp协议本身没哟压缩文件的指令  在网上以及问同事  得到两个解决方案:</pre>
<p>  第一:写shell脚本 用telnet链接远程服务器 找到待压缩文件然后压缩  在下载压缩后的文件</p>
<p>  第二:在项目中下载文件用的是common-net.jar,就想着能不能重载此jar包中的下载文件的放在,在下载前加入压缩文件的代码,让其内部先压缩在下载</p>
<p> </p>
<p>根据项目的要求及其他客观原因我选择了第一方案.</p>
<p>不说这么多废话了  下面就说下我在这个过程中遇到的问题 希望对大家有所帮助</p>
<p> </p>
<p> 首先是编写shell脚本(网上一大堆资料) ,我写的shell脚本不能执行,但把里面的命令复制在黑窗口中可以执行.   <span style="color: #ff6600;"> 原因是我在window下编写的shell,是dos格式的,放到linux下当然不能执行了, 你可以先把它转换成unix格式在执行,也可以通过指令转码.  指令是: dos2unix shellName.sh  </span></p>
<p>  shell如下: </p>
<pre name="code" class="java"> #!/bin/sh     //必须的
(sleep 1
    echo "ftpuser"  //用户名
sleep 1
    echo "ftpuser"   //密码
sleep 1
    echo "cd /export/home/omc/var/fileint/cm/autoExport/"  //待压缩文件路径
sleep 1
    echo "zip /tmp/zipXmlFile.zip $*"   //压缩文件  $* 指所有传来的参数
sleep 1
    echo "exit"       //断开链接
)|telnet 11.12.13.163    // telnet链接到指定ip    注:()表示里面是一个整体

</pre>
<p>  </p>
<p><span style="background-color: #ffffff; color: #3366ff;"> 后面接着  java调用shell并传参&lt;2&gt;</span></p>
<p> </p>

接着shell脚本以及java调用shell并传参

在者就是java中怎样调用shell脚本 及怎样给shell传参

网上找到好几种写法(实质都是Runtime.getRuntime().exec();方法不同重载形式):

第一&gt;&gt;&gt;&gt;:String[] cmd = new String[length];

cmd[0] = "./shllName.sh";

for(int i =0; i &gt;&gt;:Sring[] cmd = {"/bin/sh/", "-c", "parma1", "param2"....};

第三&gt;&gt;&gt;: 把调用shell及参数直接写在放在中即 Process pcs = Runtime.getRuntime().exec("sh shellName.sh 'param1' 'param2'...");

注:参数用单引号引起来,可以防止参数中有空格和特殊字符导致不能压缩

Process pcs = Runtime.getRuntime().exec(cmd);

//若不加这下面的代码也调不成功shell脚本 ???

InputStreamReader ir = new InputStreamReader(pcs.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line = null;
while ((line = input.readLine()) != null){
System.out.println(line);
}
if(null != input){
input.close();
}
if(null != ir){
ir.close();
}

int extValue = pcs.waitFor(); //返回码 0 表示正常退出 1表示异常退出



以上三种方式开始都可以 但不知怎么的第一 第二 都出现了问题

第一种直接不能调了 老是报 cannot execute ....

第二种传不进参数  可以调shell脚本 但传不进参数

我用的第三中 把所有的参数链接成一个大字符串 (此时的shell脚本放在和项目同目录下,放在其他目录也报第一种的异常)

报不能调用shell异常 可能是shell的路径问题 到现在也没整明白???       要是把路径写的不对吧  它会直接包shell文件 not found   不报此错误 说明它能找到shell文件  但有不能调用  唉...   高手看到能解决了说下哈 小弟感激....

<p>
以上问题的解决方案: 在路径前加上sh  即: sh /opm/ote/test/shell.sh  若后面有参数,就以字符串数组的形式加入
</p>

猜你喜欢

转载自zh9874563321.iteye.com/blog/1317172
今日推荐