Java通过Process执行C# exe程序,农民工看完都会了

return true;

    } else {

        return false;

    }

} catch (Exception e) {

    log.error("uploadFileByFtp exception:{}", e);

}

return false;

}

虽然功能实现了,但感觉缺少点什么?



二、waitFor()

-----------



waitFor()函数表示,等待子进程执行结束,或者已手动终止子进程,此方法立即返回,否则出于阻塞状态。



当RunTime对象调用exec方法后,jvm会创建一个子进程,该子进程与jvm建立三个管道连接:标准输入流、标准输出流、标准错误流。假设该子进程不断向标准输入流、标准输出流写数据,而jvm不读取的话,会导致缓冲区塞满而无法继续写数据,最终堵塞在waitFor这里。



问题的关键就是,**将缓冲区中的信息读出来,便可以避免线程阻塞问题。**

public static boolean uploadFileByFtp2() {

try {

    String path = "D:tool\uploadFileByFtp\log.txt";

    File filePath = new File(path);



    Process pro = Runtime.getRuntime().exec("cmd /c " + "D:\tool\uploadFileByFtp.exe" + " " + path);



    pro.waitFor();



    List<String> logs = FileUtils.readLines(new File(path), "UTF-8");

    // 获取最后一行 验证是取得成功

    String str = logs.get(logs.size() - 1);

    if (str.contains("success")) {

        log.info("uploadFileByFtp success");

        return true;

    } else {

        log.warn("uploadFileByFtp fail.");

        return false;

    }

} catch (Exception e) {

    log.error("uploadFileByFtp exception:{}", e);

    return false;

}

}

还有一种是获取cmd下的日志,

public static boolean uploadFileByFtp3() {

Process pro = Runtime.getRuntime().exec("cmd /c " + "D:\tool\uploadFileByFtp.exe" + " " + path);



// 标准输入流(必须写在 waitFor 之前)

String inStr = readInputStream(proc.getInputStream());

// 标准错误流(必须写在 waitFor 之前)

String errStr = readInputStream(proc.getErrorStream());



int retCode = proc.waitFor();

if(retCode == 0){

    System.out.println("文件上传成功");

}

}

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

小编整理的学习资料分享一波!

送给每一位想学习Java小伙伴,用来提升自己。

裁。

小编整理的学习资料分享一波!

送给每一位想学习Java小伙伴,用来提升自己。 [外链图片转存中…(img-Nk6Zit9e-1628579297857)]

经验分享 程序员 微信小程序 职场和发展