java tutorial - Руководство Java IO Character Streams - учебник java - java programming - учиться java - java basics - java for beginners
Введение
- В предыдущем руководстве я ознакомил вас с входным-выходным потоком (input-output binary stream), вам нужно понять о нем перед тем как изучать про входной-выходной символьный поток (input-output character stream), вы можете посмотреть по ссылке:
Разница между бинарным потоком и символьным потоком
- Бинарный поток (binary stream), каждый раз читает/записывает 1 byte (Равный 8 bit)

java - джава - учиться java - учебник java -
поток символов
- примеры java - java-программы
- При этом, символьный поток (character stream) каждый раз читает/записывает один символ, в зависимости от кодирования (encoding) ( UTF-8, UTF-16,..) где этот символ будет равен 1, 2 или 3 byte. Посмотрим на иллюстрированное изображение ниже:
UTF-16:
- Это текст на японском, если сохраниться в файле с кодированием UTF-16 (UTF-16 encoding), то byte в жестком диске будут похожи как в изображении ниже:
- Два первых byte (254,255) только означают оповещение о начале новой строки с кодом UTF-16.
- Следующие символы будут кодированы с помощью 2 byte.
- Например символ 'J' кодирован с помощью 2 byte (0 и 74)
- Символ 'P' кодирован с помощью 2 byte (0 и 80)
- ....
- При чтении из файла по кодированию UTF-16, он пропустит первые 2 byte, и прочитает последовательные 2 byte соединенные в один символ.

java - джава - учиться java - учебник java -
Java строки utf
- примеры java - java-программы
UTF-8:
- Тот же текст на японском выше при записи в файл с кодированием UTF-8 будет другим, посмотрим byte сохраненные на жестком диске:
- С символами ASCII, используется только 1 byte для хранения.
- Например, он использует 1 byte для хранения символа 'J' (74).
- Используется 1 byte для хранения символа 'P' (80).
- Для хранения других символов может использовать 2 byte или 3 byte.
- Правило для чтения 1 символа, основываясь на таблице кода UTF-8 (UTF-8 Table).
- Читает первый byte, если <= 127, то это 1 символ ASCII.
- Напротив если > 127, то нужно прочитать дальше второй byte, и проверить можно эти 2 byte соединить в 1 символ основывая на таблице кода UTF-8 или нет.
- Если первые 2 byte не соответствуют одному символу, он читает дальше третий byte и соединяет в 1 символ.
- UTF-8 использует максимум 3 byte для хранения одного символа.

java - джава - учиться java - учебник java -
utf8 строки java
- примеры java - java-программы
Обзор символьных потоков
Иерархия классов:
Class java.io.Reader
- Reader являет абстрактным классом, это базовый класс для сивольных потоков чтения.Создать файл test_reader.txt чтобы начать пример с Reader:

java - джава - учиться java - учебник java -
Иерархия классов
- примеры java - java-программы

java - джава - учиться java - учебник java -
читатель класса java
- примеры java - java-программы
HelloReader.java
package org.wikitechy.tutorial.javaio.readerwriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class HelloReader {
public static void main(String[] args) throws IOException {
// Создать Reader (Символьный поток), чтобы прочитать файл.
// С кодированием (encoding) по умолчанию.
Reader r = new FileReader("test_reader.txt");
int i = -1;
// Прочитать поочередно символы в потоке.
while ((i = r.read()) != -1) {
// Сделать cast в вид символа.
System.out.println((char) i);
}
r.close();
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда- Результат запуска примера:

java - джава - учиться java - учебник java -
java Привет читатель
- примеры java - java-программы
- Следующий пример прочитает много символов за один раз. Этот способ увеличивает эффективность программы по сравнению с поочередным чтением каждого символа.
HelloReader2.java
package org.wikitechy.tutorial.javaio.readerwriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
// Данный пример прочитает много символов за один раз.
public class HelloReader2 {
public static void main(String[] args) throws IOException {
// Создать объект Reader для чтения файла.
// С кодированием (encoding) по умолчанию.
Reader r = new FileReader("test_reader.txt");
// Создать временным массив.
// Create temporary array of characters.
char[] temp = new char[10];
int i = -1;
// Метод read(char[]):
// Прочитает много символов за один раз, и прикрепляет к элементам массива.
// Возвращает количество прочитанных символов.
// Возвращает -1 если поток (stream) закончится.
while ((i = r.read(temp)) != -1) {
String s = new String(temp, 0, i);
System.out.println(s);
}
r.close();
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаClass java.io.Writer
- Writer это абстрактный класс, являющийся базой символьного потока для записи.
HelloWriter.java
package org.wikitechy.tutorial.javaio.readerwriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class HelloWriter {
public static void main(String[] args) throws IOException {
File dir = new File("C:/test");
// Создать папку 'C:/test', если она еще не существует.
dir.mkdirs();
// Создать объект Writer, для записи данных в файл.
// С кодированием (encoding) по умолчанию.
Writer w = new FileWriter("C:/test/test_writer.txt");
// Массив символов.
char[] chars = new char[] { 'H', 'e', 'l', 'l', 'o', //
' ', 'w', 'r', 'i', 't', 'e', 'r' };
// Поочередная запись символов в поток (stream).
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
int j = (int) ch;
//
w.write(j);
}
// Закрыть поток (Close stream),
w.close();
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда- Результаты запуска примера:

java - джава - учиться java - учебник java -
класс java писатель
- примеры java - java-программы
- Следующий пример это записать много символов в поток за один раз. Точнее записать массив символов в поток. Это повышает эффективность программы по сравнению с поочередной записью каждого символа.
HelloWriter2.java
package org.wikitechy.tutorial.javaio.readerwriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class HelloWriter2 {
public static void main(String[] args) throws IOException {
File dir = new File("C:/test");
// Создать папку 'C:/test' если она еще не существует.
dir.mkdirs();
// Создать объект Writer, для записи данных в файл.
Writer w = new FileWriter("C:/test/test_writer2.txt");
//
char[] chars = new char[] { 'H', 'e', 'l', 'l', 'o', //
' ', 'w', 'r', 'i', 't', 'e', 'r' };
// Записать все символы в массиве в поток.
w.write(chars);
// Обычно Java использует буфер (buffer)
// чтобы временно сохранитьданные.
// Когда буфер (buffer) заполнен, данные будут сдвинуты (flush) в файл.
// Вы так же можете сами сдвинуть (flush) данные в файл.
w.flush();
// Записать символ с новой строки (new line character) в поток.
w.write('\n');
String s = "FileWriter";
// Записать строку в поток (stream).
w.write(s);
// Закрыть поток (Close stream).
// Он сдвинет данные с буфера (buffer) в файл.
// Одновременно закончит запись данных.
w.close();
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда- Результаты запуска примера:

java - джава - учиться java - учебник java -
класс java писатель вывода
- примеры java - java-программы
Как конвертировать бинарный поток в символьный поток?
- У вас есть бинарный поток (binary stream). И вы хотите конвертировать его в символьный поток (character stream)?

java - джава - учиться java - учебник java -
двоичный поток
- примеры java - java-программы
- В примерах выше мы ознакомились с Reader, Writer. Следующий пример позволяет вам прочитать и написать данные в поток с опредленным кодом.Создать файл test_utf8.txt

java - джава - учиться java - учебник java -
Создание файла теста
- примеры java - java-программы
- При Save, Eclipse спросит вас с каким кодированием вы хотите сохранить, выберите UTF-8.

java - джава - учиться java - учебник java -
сохранение проблемы
- примеры java - java-программы
InputStreamReaderExample.java
package org.wikitechy.tutorial.javaio;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
public class InputStreamReaderExample {
public static void main(String[] args) throws IOException {
// Создать binary Stream (бинарный поток), для чтения файла.
InputStream in = new FileInputStream("test_utf8.txt");
// Создать Character stream (символьный поток) обертывающий (wrap) бинарный поток выше.
// Với mã hóa (encoding) là UTF-8.
Reader reader = new InputStreamReader(in, "UTF-8");
int i = 0;
// Прочитать поочередно каждый символ.
while ((i = reader.read()) != -1) {
// Сделать cast в символ и напечатать на экране.
System.out.println((char) i + " " + i);
}
reader.close();
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда- Результаты запуска примера

java - джава - учиться java - учебник java -
Пример чтения входного потока
- примеры java - java-программы
- Следующий пример записывает файл с определенным кодированием UTF-8.
OutputStreamWriterExample.java
package org.wikitechy.tutorial.javaio;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class OutputStreamWriterExample {
public static void main(String[] args) throws IOException {
File dir = new File("C:/test");
// Создать папку 'C:/test' если она не существует.
dir.mkdirs();
// Создать OutputStream (выходной поток) для записи данных в файл.
OutputStream out = new FileOutputStream("C:/test/test_write_utf8.txt");
// Создать Character Stream (символьный поток) обертывающий OutputStream выше.
// Кодированием (encoding) является UTF-8.
Writer writer = new OutputStreamWriter(out, "UTF-8");
String s = "JP日本-八洲";
writer.write(s);
writer.close();
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда- Результаты запуска примера

java - джава - учиться java - учебник java -
входной поток чтения вывода
- примеры java - java-программы
Class java.io.BufferedReader
- Если вы хотите прочитать данные текстового файла. BufferedReader является хорошим выбором.

java - джава - учиться java - учебник java -
входно поок чтения вывода
- примеры java - java-программы
// BufferedReader является прямым подклассом Reader .
// Constructor:
public BufferedReader(Reader in);
// Удобный метод полученный от BufferedReader.
// Чтение строки текста.
public String readLine();
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда// Пример 1:
Reader r=new FileReader("C:/test.txt");
BufferedReader br=new BufferedReader(r);
// Пример 2:
InputStream in = new FileInputStream("C:/test.txt");
Reader r = new InputStreamReader(in, "UTF-8");
BufferReader br = new BufferedReader(r);
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
java - джава - учиться java - учебник java -
тестирование нескольких линий
- примеры java - java-программы
test_multi_lines.txt
## Fruit List
Apricots
Barbados Cherries
Bitter Melon
Cherimoya
Honeydew
Jackfruit
Limes
Lychee
Mango
Oranges
Pineapple
Strawberries
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаBufferedReaderExample.java
package org.wikitechy.tutorial.javaio.buffered;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
public class BufferedReaderExample {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream("test_multi_lines.txt");
Reader reader = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(reader);
String s = null;
int i = 0;
// Прочитать каждую строку (line) данных.
// Если читается null значит завершился Stream.
while ((s = br.readLine()) != null) {
i++;
System.out.println(i + " : " + s);
}
br.close();
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаРезультаты запуска примера:

java - джава - учиться java - учебник java -
Пример чтения буфера
- примеры java - java-программы
Class java.io.BufferedWriter
- BufferedWriter это прямой подкласс Writer.
// Создать объект BufferedWriter
// с помощью обертывания (wrap) другого объекта Writer.
public BufferedWriter(Writer out);
// Индентично с write('\n');
public String newLine();
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаПример:
// Создать объект Writer.
Writer w=new FileWriter("C:/test/test_bufferedWriter.txt");
// Создать объект BufferedWriter обертывающий (wrap) writer.
BufferedWriter bw=new BufferedWriter(w);
bw.write("Hello..");
// Записать символ с новой строки '\n'.
bw.newLine();
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда