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 строки utf
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 для хранения одного символа.
 utf8 строки java
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 - 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 - 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 - 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 - 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 - команда

Related Searches to Руководство Java IO Character Streams