2015-05-26 7 views
1
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); 
    } 
} 

}Java Console проблема кодирования

Фактический выход консоли:

windows-1251 

"echojhj" ­Ґ пў«пҐвбп ў­гв७­Ґ© Ё«Ё ў­Ґи­Ґ© 
Є®¬ ­¤®©, ЁбЇ®«­пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐв­л¬ д ©«®¬. 

Ожидаемый выход консоли:

windows-1251 

"echojhj" не является внутренней или внешней 
командой, исполняемой программой или пакетным файлом. 

Я пытаюсь использовать PrintStream для указания кодировки System.out, но он не работает. Я не понимаю, почему он не работает. Есть идеи ?

+0

Что «это не работает» означает? Вы получили сообщение об ошибке? Если да, то какова ошибка? Вы получаете неожиданный результат? Что вы ожидали и как это отличается от того, что на самом деле происходит? – Jesper

+0

Я получаю неожиданный вывод консоли. Я ожидаю этого: «echojhj» не является внутренней или внешней команда, исполняемая программа или пакетным файлом. –

ответ

0

Вы можете использовать этот метод для копирования данных:

IOUtils.copy(InputStream, Writer)

В документации состояний:

Копировать байты из InputStream в гольцов на Writer, используя кодировку по умолчанию символов из Платформа.

Кодировка, которую вы указываете для PrintStream, является кодировкой для выходного потока, а не кодировкой, с которой будет разбираться errorStream. Таким образом, вы должны использовать этот метод вместо:

IOUtils.copy(InputStream, Writer, Charset)

+0

Как я понимаю, есть только один способ: 1. Создайте писателя и перейдите к copy(). 2.После завершения копирования вручную вызовите flush() или close(), чтобы увидеть результат на консоли? –

+0

@ Kostya-OniL да, если я правильно понял ваш код –

+0

спасибо, Сергей! –

Смежные вопросы