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
, который добавляет разделитель строки для текущей операционной системы. Это не могло бы быть тем же самым разделителем строки, который использовался во входном файле.
Есть много способов структурировать текстовый ввод и вывод вне символов и строк. Для получения дополнительной информации см. Сканирование и Форматирование.