Java实现写临时文件/脚本,并调用临时脚本执行

        项目需求,需要通过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脚本:

参考我之前的一篇文章:java调用shell脚本及注意事项

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你认识小汐吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值