java练习(16.08.03)cmd命令执行

题目详情

编写通用的java代码执行任意adb命令,例如控制台输入adb devices。 
具体要求如下: 
1、将结果打印到控制台并将其保存在log.txt里面; 
2、log.txt文件大于200k对其进行归档; 
3、log内容格式如下:

*2016-7-29 11:20** 
下面是命令输出的具体信息 
List of devices attached 
* daemon not running. starting it now on port 5037 * 
* daemon started successfully *

代码实现

实现思路:

利用Runtime类的成员exec方法运行cmd获得一个process对象,从process的getInputStream方法获取process的输入流,以此获得cmd命令的执行结果。

归档:对日志文件输出后判断其大小,如果超过200k则重新将上次输出的内容覆盖输出到原文件


CmdUtils类:设置了用于执行cmd命令并进行读写的方法

package fgb;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class CmdUtils {

	// 输入cmd命令返回一个进程
	private static Process processCreater() throws IOException {
		System.out.println("请输入命令");
		Scanner scanner = new Scanner(System.in);
		StringBuilder str = new StringBuilder("cmd /c ");
		str.append(scanner.nextLine());
		Process process = Runtime.getRuntime().exec(str.toString());
		scanner.close();
		return process;
	}

	/*
	 * 输入一个cmd命令并在cmd上执行此命令 输出cmd的输出信息 并将这些信息保存到output.txt中
	 * output.txt满200k则进行一次归档
	 */
	public static void runCmd() {
		try {
			Process process = processCreater();

			InputStream inputStream = process.getInputStream();

			byte[] buf = new byte[128];
			StringBuilder result = new StringBuilder();
			while (inputStream.read(buf) > -1) {
				//GB2312为中文windows系统的cmd的默认编码
				result.append(new String(buf, "GB2312"));
				buf = new byte[128];
			}
			System.out.println(result);
			File output = new File("log.txt");
			if (!output.exists()) {
				output.createNewFile();
			}
			FileWriter fw = new FileWriter(output, true);
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			fw.write(sdf.format(new Date()));
			fw.write("\r\n下面是输出的具体信息\r\n");
			fw.write(result.toString());
			// 文件大小超过200k则进行归档
			if (output.length() > 204800) {
				fw.close();
				fw = new FileWriter(output, false);
				fw.write(sdf.format(new Date()));
				fw.write("\r\n下面是输出的具体信息\r\n");
				fw.write(result.toString());
			}
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Test类:

package fgb;

public class Test {
	public static void main(String[] args) {
		CmdUtils.runCmd();
	}
}
运行结果:
请输入命令
adb devices
List of devices attached
emulator-5586	host



说明

关于读取cmd信息时出现乱码/编码不兼容现象。

在java中byte数组转换成String类型时,会先转化成char数组再转成String,String类有一个构造器可以完成上述转换。

出现乱码/编码不兼容的原因:从流中读取文本时的将文本转换成字两者使用的编码不一样。节的方式和将字节数组转换成String时的方式不一样,简单来说就是两者使用的编码方式不一致。

String类有一个构造器可以使用byte数组按制定的编码方式初始化一个字符串,此时只要保持编码方式和cmd的编码方式一致即可减少乱码发生的情况

中文windows下,cmd的默认编码是GB2312

这道题本来要求是执行adb命令的,但因为我是在cmd中执行的,所以就直接写成执行cmd命令的程序了


文章分享

博主在网上查了好多资料,然而并没有找到能将读取进程信息时乱码的问题完美解决的方法。即使读写的编码一致仍有很小部分的编码不兼容。

但我还是想推荐一下博主我查资料是找到的两篇值得参考的文章。

在Windows的CMD中如何设置支持UTF8编码?

Java读取中文的乱码问题 - 智障大师 的专栏 - 博客频道 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值