Java控制台编码问题

时间:2015-05-26 14:34:56

标签: java

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编码,但它不起作用。我不明白为什么它不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用此方法复制数据:

IOUtils.copy(InputStream, Writer)

正如文件所述:

  

使用平台的默认字符编码将InputStream中的字节复制到Writer上的字符。

您为PrintStream指定的编码是输出流的编码,而不是用于解析errorStream的编码。所以你应该使用这种方法:

IOUtils.copy(InputStream, Writer, Charset)