package com;
import org.apache.commons.io.IOUtils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
public class Test {
public static void main(String[] args) throws Exception {
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "echojhj sdfsdfsdfsdf");
Process process = builder.start();
InputStream errorStream = process.getErrorStream();
System.out.println(System.getProperty("file.encoding"));
final String CP866 = "Cp866";
//not work
//IOUtils.copy(errorStream, new PrintStream(System.out, true, CP866));
//process.getInputStream().close();
//work
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(errorStream, CP866));
String s = null;
while ((s = bufferedReader.readLine()) != null) {
System.out.println(s);
}
}
}
实际控制台输出:
windows-1251
"echojhj" Ґ пў«пҐвбп ўгв॥© Ё«Ё ўҐиҐ©
Є®¬ ¤®©, ЁбЇ®«пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐвл¬ д ©«®¬.
预期的控制台输出:
windows-1251
"echojhj" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
我尝试使用PrintStream来指定System.out编码,但它不起作用。我不明白为什么它不起作用。有什么想法吗?
答案 0 :(得分:0)
您可以使用此方法复制数据:
IOUtils.copy(InputStream, Writer)
正如文件所述:
使用平台的默认字符编码将InputStream中的字节复制到Writer上的字符。
您为PrintStream指定的编码是输出流的编码,而不是用于解析errorStream的编码。所以你应该使用这种方法: