博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java实现写临时文件/脚本,并调用临时脚本执行
阅读量:4028 次
发布时间:2019-05-24

本文共 2272 字,大约阅读时间需要 7 分钟。

        项目需求,需要通过java调用shell脚本实现逻辑,但是又不想java服务绑定一个脚本,每次部署都得带着脚本,所以想实现Java写一个临时脚本,执行完就删掉(测试了下,shell脚本可以在自己脚本里删除自己)。

遇到的问题:

1. 换行问题

        使用Java的IO流在写文件时,一行一行写,需要换行,就在每行后面拼上了\r\n,写出来发现不好使,后来找到System.getProperty("line.separator")方法,会根据系统类型生成系统自己的换行符,完美解决换行问题;

 

2. 编码问题

        写出来文件,使用vim查看显示时[dos]编码,调用脚本会提示 No such file or directory,最后使用System.getProperty("file.encoding")获取系统编码,写入时将字符串进行编码设置,解决问题;

 

直接上代码:

public static String writeTempFile() throws IOException {	String filePath;	//创建临时文件	File file = new File("/temp/deal_business_" + System.currentTimeMillis() + ".sh");    //获取文件全路径,并且判断父目录是否存在,不存在通过mkdirs方法,创建目录	filePath = file.getPath();	if (!file.getParentFile().exists()) {		file.getParentFile().mkdirs();	}	Boolean result = true;	if (!file.exists()) {	    //判断文件是否存在,不存在就创建文件		result = file.createNewFile();	}	if (result) {		log.info("文件路径:{}", filePath);		//使用try-with-resources进行流关闭		try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {		    			//获取系统编码			String fileEncode = System.getProperty("file.encoding");						//设置编码+添加换行符			bw.write(new String("#!/bin/sh".getBytes("UTF-8"), fileEncode) + System.getProperty("line.separator"));						bw.write(new String("#处理业务逻辑".getBytes("UTF-8"), fileEncode) + System.getProperty("line.separator"));			bw.write(new String("path=$1".getBytes("UTF-8"), fileEncode) + System.getProperty("line.separator"));			bw.write(new String("scriptFile=$2".getBytes("UTF-8"), fileEncode) + System.getProperty("line.separator"));			//-p :如果多级目录不存在,创建目录			bw.write(new String("mkdir -p /temp/produt/$path".getBytes("UTF-8"), fileEncode) + System.getProperty("line.separator"));						//cp -a 复制目录下所有内容,后面添加/. 会将目录下.开头的隐藏文件也一同复制过去,这里我们需要隐藏文件,所以一同复制过去了			bw.write(new String("cp -a /temp/beta/. /temp/produt/$path".getBytes("UTF-8"), fileEncode) + System.getProperty("line.separator"));			//业务逻辑...						//最后添加删除临时脚本目录,脚本路径在执行的时候通过参数传递进去			bw.write(new String("rm -rf $scriptFile".getBytes("UTF-8"), fileEncode) + System.getProperty("line.separator"));			bw.write(new String("echo ================= SUCCESS END".getBytes("UTF-8"), fileEncode);			//关闭流			bw.close();			log.info("生成临时文件成功");		} catch (Exception e) {			log.error("生成临时文件出现异常!", e);		} finally {			log.info("生成临时文件结束!");		}	}    //返回文件路径	return filePath;}

java调用shell脚本:

参考我之前的一篇文章:

 

转载地址:http://edtbi.baihongyu.com/

你可能感兴趣的文章
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS AFN 3.0版本前后区别 02
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Android(三) 数据存储之二 SharedPreferences
查看>>
Android(三)数据存储之三SQLite嵌入式数据库
查看>>
Tomcat 6 数据源配置详解
查看>>
『网页制作』页面滚动HTML代码
查看>>
request得到select多选的值
查看>>
WSDL详解
查看>>
struts标签介绍大全
查看>>
logic:iterate用法详解
查看>>
关于导出数据为Excel的几种方式
查看>>
Display Tag使用小记
查看>>