2014-01-02 1 views
0

Я пытаюсь прочитать байты, которые у меня есть в массиве, и если я использую объект PrintWriter, на экране ничего не печатается, однако, используя System. out.println() работает отлично. Зачем?Печать целого числа с использованием printwriter vs System.out.print

Вот что мой код выглядит следующим образом:

private static void readByteArray(byte[] bytes) { 
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes); 
    PrintWriter pw = new PrintWriter(System.out); 

    int c; 
    while((c = bais.read()) != -1) { 
    pw.print(c); 
} 

Этот код не работает, но если я это сделать:

private static void readByteArray(byte[] bytes) { 
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes); 
    PrintWriter pw = new PrintWriter(System.out); 

    int c; 
    while((c = bais.read()) != -1) { 
    System.out.println(c); 
} 

Он печатает.

В чем разница? В соответствии с этим http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html метод PrintWriter print(int i) печатает целое число, поэтому я запутался.

+3

Флеш флеш флеш! –

+0

Вы пытались использовать 'pw.println' вместо' print' в своей первой функции? – dasblinkenlight

+0

Посмотрите на это сообщение: http://stackoverflow.com/questions/9927281/how-to-use-flush-for-printwriter – 735Tesla

ответ

3

Переменная System.out ссылается на объект типа PrintStream, который обертывает BufferedOutputStream (по крайней мере, в Oracle JDK 7). Когда вы вызываете один из методов printX() или write() на PrintStream, он внутренне сбрасывает буфер нижележащего BufferedOutputStream.

Это не происходит с PrintWriter. Вы должны сделать это сами. Кроме того, вы можете создать PrintWriter с параметром autoFlush, установленным на true, который будет скрываться при каждой записи.

PrintWriter pw = new PrintWriter(System.out, true); 

Если вы читаете этот constructor's javadoc, говорится

  • AutoFlush A булево; если это правда, методы Println, PRINTF или форматировать смоет выходной буфер