题目详情
编写通用的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命令的程序了
文章分享
博主在网上查了好多资料,然而并没有找到能将读取进程信息时乱码的问题完美解决的方法。即使读写的编码一致仍有很小部分的编码不兼容。
但我还是想推荐一下博主我查资料是找到的两篇值得参考的文章。