Почему печать '\ 0' аннулирует остальную часть строки в Java? - PullRequest
2 голосов
/ 05 ноября 2011

Я с удивлением обнаружил, что следующий фрагмент:

void print() {
    System.out.print("!");
    System.out.print("!\0");
    System.out.flush(); // This line does not affect the outcome
    System.out.println("!");
    System.out.println("!");
}

будет только распечатывать:

!!
!

Я искал реализацию исходного кода Open JDK, но нетпомочь.

Единственная подсказка имеет подсказку о том, что она выглядит как BufferedOutputStream, и, похоже, также имеет аналогичное поведение "прекратить на \ u0000".

Также я не могу найти какую-либо документацию оэто довольно неожиданное (для меня) поведение.

РЕДАКТИРОВАТЬ: Моя среда:

java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)

IDE: Eclipse Indigo 3.7.0

ИЗМЕНИТЬ СНОВА: В командной строке этот код работает, как и ожидалось (четыре "!").Таким образом, похоже, что это ошибка для Eclipse 3.7.0 Indigo под Ubuntu?

(Должно быть) ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Кажется, что, как сказал неопровержимый и amir75, это не причуда Java: я перенаправил выводEclipse в файл, и если я открою его в Eclipse, у контента будет только три "!";но при использовании cat из командной строки их четыре.Кроме того, vi и emacs показывают !!^@! для первой строки, как и ожидалось.Спасибо всем!

Может кто-нибудь пролить свет на это?Требуется ли это где-нибудь в Java Spec?Спасибо за любые комментарии!

Ответы [ 2 ]

3 голосов
/ 05 ноября 2011

Это зависит от терминала: я только что попробовал в Eclipse, и он воспроизвел вашу ошибку.В командной строке это не так.

Я думаю, этого можно ожидать, потому что большинство языков, начиная с C, используют \0 (нулевой байт) для обозначения конца строки.

Благодаря покойному великому Деннису Ритчи все работает.

2 голосов
/ 05 ноября 2011

Java, вероятно, не контролирует поведение - именно консоль определяет, как интерпретировать байты.Консоль не всегда печатает как есть;некоторые байты могут даже вызвать изменение цвета или сделать звуковой сигнал.

...