还好当初保存文件时,都是一个文件夹 保存一个文件的。就只能使用 Runtime.getRuntime().exec(cmd) 来重命名文件了。所以就将Runtime.getRuntime().exec(cmd) 学习了一下,此处保留下当时使用的一些代码:
修改文件时的路径需要填写绝对路径,并且 Linux 下使用 "/" ,Windows 下使用 "\",当初使用 File.separator 出现了异常,所以我都是直接使用字符的。
if (isWindows) {
execCmd(parentFile.getName(), childFile[0].getName(), nameMap.get(parentFile.getName()), "cmd /c ren " + cmd.toString().replace("/", "\\"), true);
} else {
execCmd(parentFile.getName(), childFile[0].getName(), nameMap.get(parentFile.getName()), "mv " + cmd.toString().replace("\\", "/"), false);
}
/**
* 执行命令行
*
* @param parentPath
* @param sorFileName
* @param tarFileName
* @param cmd
* @param isWindows
*/
private void execCmd(String parentPath, String sorFileName, String tarFileName, String cmd, boolean isWindows) {
try {
System.err.println(cmd.toString());
Process process = null;
if (isWindows) {
process = Runtime.getRuntime().exec(cmd);
} else {
// exec 只接受GBK的命令,其他的命令为乱码
String[] cmds = { "/bin/sh", "-c", new String(cmd.getBytes("UTF-8"), "GBK") };
process = Runtime.getRuntime().exec(cmds);
}
// any error message?
StreamGobbler err = new StreamGobbler(process.getErrorStream());
// any output?
StreamGobbler out = new StreamGobbler(process.getInputStream());
err.start();
out.start();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
外部程序开始执行的时候必须马上控制输入、输出、出错这些流,所以采用多线程的方式输出这些流
class StreamGobbler extends Thread {
InputStream is;
StreamGobbler(InputStream is) {
this.is = is;
}
public void run() {
InputStreamReader isr = null;
BufferedReader br = null;
try {
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line = null;
StringBuffer infoMsg = new StringBuffer();
while ((line = br.readLine()) != null) {
infoMsg.append(line).append("\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (isr != null) {
isr.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}