Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Основной ввод-вывод
Раздел: Потоки ввода-вывода
Символьные Потоки
Домашняя страница > Существенные Классы > Основной ввод-вывод

Символьные Потоки

Платформа Java хранит символьные значения, используя соглашения Unicode. Символьный потоковый ввод-вывод автоматически преобразовывает этот внутренний формат в и от локального набора символов. В Западных локалях локальный набор символов обычно является 8-разрядным надмножеством ASCII.

Для большинства приложений ввод-вывод с символьными потоками не более сложен чем ввод-вывод с потоками байтов. Ввод и вывод, сделанный с потоковыми классами автоматически, преобразовывает в и от локального набора символов. Программа, которая использует символьные потоки вместо потоков байтов автоматически, адаптируется к локальному набору символов и готова к интернационализации — все без дополнительного усилия программиста.

Если интернационализация не является приоритетом, можно просто использовать символьные потоковые классы, не обращая много внимания на проблемы набора символов. Позже, если интернационализация становится приоритетом, Ваша программа может быть адаптирована без обширного перекодирования. См., что Интернационализация запаздывает для получения дополнительной информации.

Используя Символьные Потоки

Все символьные потоковые классы происходят от Reader и Writer. Как с потоками байтов, есть символьные потоковые классы, которые специализируются на файловом вводе-выводе: FileReader и FileWriter. CopyCharacters пример иллюстрирует эти классы.

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyCharacters {
    public static void main(String[] args) throws IOException {

        FileReader inputStream = null;
        FileWriter outputStream = null;

        try {
            inputStream = new FileReader("xanadu.txt");
            outputStream = new FileWriter("characteroutput.txt");

            int c;
            while ((c = inputStream.read()) != -1) {
                outputStream.write(c);
            }
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}

CopyCharacters очень подобно CopyBytes. Наиболее важное различие - это CopyCharacters использование FileReader и FileWriter для ввода и вывода вместо FileInputStream и FileOutputStream. Заметьте это оба CopyBytes и CopyCharacters используйте int переменная, чтобы читать в и запись от. Однако, в CopyCharacters, int переменная содержит символьное значение в своих последних 16 битах; в CopyBytes, int переменная содержит a byte значение в его последних 8 битах.

Символьные Потоки то Использование Потоки байтов

Символьные потоки часто являются "обертками" для потоков байтов. Символьный поток использует поток байтов, чтобы выполнить физический ввод-вывод, в то время как символьный поток обрабатывает преобразование между символами и байтами. FileReader, например, использование FileInputStream, в то время как FileWriter использование FileOutputStream.

Есть два потока "моста" байта-к-символьному общего назначения: InputStreamReader и OutputStreamWriter. Используйте их, чтобы создать символьные потоки, когда нет никаких предварительно упакованных символьных потоковых классов, которые удовлетворяют Ваши потребности. Урок сокетов в объединяющемся в сеть следе показывает, как создать символьные потоки из потоков байтов, обеспеченных классами сокета.

Ориентированный на строку ввод-вывод

Символьный ввод-вывод обычно происходит в больших модулях чем единственные символы. Один общий модуль является строкой: строка символов с разделителем строки в конце. Разделитель строки может быть последовательностью возврата каретки/перевода строки ("\r\n"), единственный возврат каретки ("\r"), или единственный перевод строки ("\n"). Поддержка всех возможных разделителей строки позволяет программам читать текстовые файлы, создаваемые на любой из широко используемых операционных систем.

Давайте изменим CopyCharacters пример, чтобы использовать ориентированный на строку ввод-вывод. Чтобы сделать это, мы должны использовать два класса, которые мы не видели прежде, BufferedReader и PrintWriter. Мы исследуем эти классы в большей глубине в Буферизованном вводе-выводе и Форматировании. Прямо сейчас мы только интересуемся их поддержкой ориентированного на строку ввода-вывода.

CopyLines пример вызывает BufferedReader.readLine и PrintWriter.println сделать ввод и вывод одна строка за один раз.

import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;

public class CopyLines {
    public static void main(String[] args) throws IOException {

        BufferedReader inputStream = null;
        PrintWriter outputStream = null;

        try {
            inputStream = new BufferedReader(new FileReader("xanadu.txt"));
            outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));

            String l;
            while ((l = inputStream.readLine()) != null) {
                outputStream.println(l);
            }
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}

Вызов readLine возвращает строку текста со строкой. CopyLines выводы каждое использование строки println, который добавляет разделитель строки для текущей операционной системы. Это не могло бы быть тем же самым разделителем строки, который использовался во входном файле.

Есть много способов структурировать текстовый ввод и вывод вне символов и строк. Для получения дополнительной информации см. Сканирование и Форматирование.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Потоки байтов
Следующая страница: Буферизованные Потоки