Консольный ввод/вывод
Для вывода на консоль мы всегда использовали метод println() класса PrintStream, никогда не определяя экземпляры этого класса. Мы просто использовали статическое поле out класса System, которое является объектом класса PrintStream. Исполняющая система Java связывает это поле с консолью.
Кстати, если вам надоело писать System.out.println(), то вы можете определить новую ссылку на System.out, например:
PrintStream pr = System.out;
и писать просто pr.println().
Консоль является байтовым устройством, и символы Unicode перед выводом на консоль должны быть преобразованы в байты. Для символов Latin 1 с кодами '\u0000'— '\u00FF' при этом просто откидывается нулевой старший байт и выводятся байты '0x00'—'0xFF'. Для кодов кириллицы, которые лежат в диапазоне '\u0400'—'\u04FF' кодировки Unicode, и других национальных алфавитов производится преобразование по кодовой таблице, соответствующей установленной на компьютере локали. Мы уже обсуждали это в главе 5.
Трудности с отображением кириллицы возникают, если вывод на консоль производится в кодировке, отличной от локали. Именно так происходит в русифицированных версиях MS Windows. Обычно в них устанавливается локаль с кодовой страницей CP1251, а вывод на консоль происходит в кодировке CP866.
В этом случае надо заменить PrintStream, который не может работать с символьным потоком, на PrintWriter и "вставить переходное кольцо" между потоком символов Unicode и потоком байтов System.out, выводимых на консоль, в виде объекта класса OutputStreamWriter. В конструкторе этого объекта следует указать нужную кодировку, в данном случае CP866. Все это можно сделать одним оператором:
PrintWriter pw = new PrintWriter(
new OutputStreamWriter(System.out, "Cp866"), true);
Класс PrintWriter буферизует выходной поток. Второй аргумент true его конструктора вызывает принудительный сброс содержимого буфера в выходной поток после каждого выполнения метода println(). Но после выполнения метода print() буфер не сбрасывается! Для сброса буфера после каждого обращения к методу print() надо обращаться к методу flush().
ЗАМЕЧАНИЕ
Методы класса PrintWriter по умолчанию не очищают буфер, а метод print() не очищает его в любом случае. Для очистки буфера используйте метод flush().
После этого можно выводить любой текст методами класса PrintWriter, которые просто дублируют методы класса PrintStream, и писать, например,
pw.println("Это русский текст");
- Введение
- Выполнение Java-программы
- Как использовать JDK?
- Литература по Java
- Аннотации
- Константы
- Целые
- Имена
- Примитивные типы данных и операции
- Операции над целыми типами
- Арифметические операции
- Сдвиги
- Упражнения
- Условная операция
- Упражнения
- Выражения
- Операторы
- Операторы цикла
- Массивы
- Принципы объектно-ориентированного программирования
- Абстракция
- Ответственность
- Упражнения
- Как описать класс и подкласс?
- Переопределение методов
- Операция new
- Упражнение
- Статические члены класса
- Вложенные классы
- Отношения "быть частью" и "являться"
- Размещение пакетов по файлам
- Перечисления
- Design patterns
- Схема проектирования MVC
- Заключение
- Вопросы для самопроверки
- Настраиваемые типы (generics)
- Класс String
- Как создать строку
- Упражнение
- Сцепление строк
- Как узнать длину строки
- Как найти символ в строке
- Упражнения
- Класс StringBuilder
- Конструкторы
- Синтаксический разбор строки
- Класс StringTokenizer
- Класс Stack
- Интерфейс Collection
- Интерфейс List
- Интерфейс Set
- Интерфейс SortedSet
- Интерфейс Queue
- Интерфейс BlockingQueue
- Интерфейс Deque
- Интерфейс Map
- Абстрактные классы-коллекции
- Интерфейс Iterator
- Классы, создающие списки
- Упражнение
- Классы, создающие отображения
- Связанные отображения
- Упорядоченные отображения
- Упражнение
- Классы, создающие множества
- Связанные множества
- Заключение
- Вопросы для самопроверки
- Получение случайных чисел
- Копирование массивов
- Использование системных приложений
- Splash Screen
- Заключение
- Вопросы для самопроверки
- Класс FontMetrics
- Преобразование координат
- Класс AffineTransform
- Вывод текста средствами Java 2D
- Упражнение
- Заключение
- Вопросы для самопроверки
- Класс Cursor
- Как создать свой курсор
- Класс Container
- События
- Текстовая метка Label
- События
- Кнопка Button
- События
- Кнопка выбора Checkbox
- События
- Класс CheckboxGroup
- События
- Строка ввода TextField
- События
- Поле ввода TextArea
- Линейка прокрутки Scrollbar
- События
- Контейнер Panel
- Контейнер Window
- События
- Контейнер Dialog
- Основные компоненты Swing
- Компонент JComponent
- Упражнение
- Счетчик JSpinner
- Упражнение
- Индикатор JProgressBar
- Дерево объектов JTree
- Построение меню средствами Swing
- Строка меню JMenuBar
- Меню JMenu
- Пункт меню JMenuItem
- Пункт меню JCheckBoxMenuItem
- Пункт меню JRadioButtonMenuItem
- Всплывающее меню JPopupMenu
- Панель выбора цвета JColorChooser
- Упражнение
- Окно выбора файла JFileChooser
- Фильтр файлов FileFilter
- События в документе
- Реализации документа
- Контроллер — редактор текста
- Курсор
- Реализации редактора
- Раскладка клавиатуры
- Область ввода JTextArea
- Модель данных таблицы
- Модель ячеек таблицы
- Визуализация ячеек таблицы
- Вопросы для самопроверки
- Контейнеры Swing
- Панель JPanel
- Панель с вкладками JTabbedPane
- Линейная панель Box
- Менеджер размещения BoxLayout
- Слоеная панель JLayeredPane
- Диалоговое окно JDialog
- Упражнение
- Событие ActionEvent
- Обработка действий мыши
- Событие изменения ChangeEvent
- Обработка действий с окном
- Несколько слушателей одного источника
- Вопросы для самопроверки
- Объемная рамка BevelBorder
- Закругленная объемная рамка SoftBevelBorder
- Врезанная рамка EtchedBorder
- Рамка с изображением MatteBorder
- Задание стандартного L&F
- Вопросы для самопроверки
- Сведения об окружении апплета
- Упражнение
- Изображение и звук в апплетах
- Слежение за процессом загрузки
- Заключение
- Вопросы для самопроверки
- Упражнения
- Звук
- Синтез и запись звука в Java
- Вопросы для самопроверки
- Порядок обработки исключений
- Упражнение
- Синхронизация подпроцессов
- Приоритеты подпроцессов
- Консольный ввод/вывод
- Форматированный вывод
- Класс Console
- Упражнения
- Файловый ввод/вывод
- Поток простых типов Java
- Кодировка UTF-8
- Класс DataOutputStream
- Прямой доступ к файлу
- Упражнение
- Каналы обмена информацией
- Печать в Java
- Печать средствами Java 2D
- Вопросы для самопроверки
- Работа в WWW
- Работа по протоколу TCP
- Упражнения
- Работа по протоколу UDP
- Компоненты JavaBeans
- Вопросы для самопроверки
- Интерфейс ServletResponse
- Цикл работы сервлета
- Работа по протоколу HTTP
- Интерфейс HttpServletRequest
- Сеанс связи с сервлетом
- Обращение к другим ресурсам
- Вопросы для самопроверки
- Язык записи выражений EL
- Обращение к компоненту JavaBean
- Обработка взаимодействующих тегов
- Обработка исключений в пользовательских тегах
- Обработка тегов средствами JSP
- Стандартные библиотеки тегов JSTL
- Библиотека xml
- Библиотека fmt
- Библиотека sql
- Библиотека fn
- Frameworks
- Вопросы для самопроверки
- Схема XML
- Встроенные простые типы XSD
- Вещественные числа
- Целые числа
- Строки символов
- Определение простых типов
- Сужение
- Описание элементов и их атрибутов
- Определение сложных типов
- Определение типа со сложным телом
- Другие языки описания схем
- Инструкции по обработке
- Анализ документов XML с помощью DOM API
- Другие DOM-парсеры
- Преобразование дерева объектов в XML
- Список литературы