В этой статье анализируется разница между потоками символов и байтовыми потоками в Java для вашей ссылки. Конкретный контент заключается в следующем
1. Что такое поток
Поток в Java является абстракцией байтовых последовательностей. Мы можем представить, что есть водопроводная труба, но теперь это больше не вода, текущая в водопроводной трубе, а байтовая последовательность. Как потоки воды, потоки в Java также имеют «направление потока». Объект, из которого можно прочитать последовательность байтов, называется входным потоком; Объект, на который записана последовательность байтов, называется выходным потоком.
2. байтовый поток
Самая основная единица обработки потока байтов в Java - это единый байт, который обычно используется для обработки двоичных данных. Два самых основных классов байтовых потоков в Java являются InputStream и OutputStream, которые представляют группу базовых входных байтовых потоков и выходных байтовых потоков соответственно. Как класс InputStream, так и класс outputstream являются абстрактными классами. В реальном использовании мы обычно используем серию подклассов из них, представленных в библиотеке классов Java. Давайте возьмем класс InputStream в качестве примера для представления байтового потока в Java.
Класс InputStream определяет основной метод чтения для чтения байтов из байтового потока. Определение этого метода заключается в следующем:
Public Abstract int Read () бросает ioException;
Это абстрактный метод, то есть любой класс входного байтового потока, полученный из InputStream, необходимых для реализации этого метода. Функция этого метода состоит в том, чтобы прочитать байт из байтового потока и вернуть -1, если он достигает конца, в противном случае вернуть байт чтения. Что нам нужно отметить в этом методе, так это то, что он будет продолжать блокировать и возвращать байт чтения или -1. Кроме того, байтовые потоки не поддерживают кэширование по умолчанию, что означает, что каждый раз, когда называется метод чтения, операционная система будет просить операционную систему прочитать один байт, который часто сопровождается диском IO, поэтому она будет относительно неэффективной. Некоторые друзья могут подумать, что перегруженный метод чтения в классе InputStream с массивом байтов, поскольку параметры могут читать несколько байтов за раз без частых дисков. Так это так? Давайте посмотрим на исходный код этого метода:
public int Read (Byte B []) бросает ioException {return Read (b, 0, b.length);}Он вызывает другую версию метода перегрузки чтения, поэтому мы будем продолжать следовать:
public int Read (byte b [], int off, int len) бросает ioexception {if (b == null) {бросить новый nullpointerexception (); } else if (off <0 || len <0 || len> b.length - off) {бросить новый indexoutofboundsexception (); } else if (len == 0) {return 0; } int c = Read (); if (c == -1) {return -1; } b [off] = (byte) c; int i = 1; try {for (; i <len; i ++) {c = Read (); if (c == -1) {break; } b [off + i] = (byte) c; }} catch (ioException ee) {} return i; }Из приведенного выше кода мы видим, что на самом деле метод чтения (байт []) также использует цикл для вызова метода read () для чтения в массив байтов «одновременно», поэтому в этом методе не используется буфер памяти. Чтобы использовать буферы памяти для повышения эффективности чтения, мы должны использовать BufferedInputStream.
3. Поток персонажей
Самая основная единица обработки потока символов в Java - символ Unicode (2 байта по размеру), который обычно используется для обработки текстовых данных. Так называемый символ Unicode представляет собой единицу кода Unicode с диапазоном 0x0000 ~ 0xffff. Каждое число в вышеуказанном диапазоне соответствует символу. Тип строки в Java кодирует символы в правилах Unicode по умолчанию, а затем хранит их в памяти. Однако, в отличие от хранимых в памяти, данные, хранящиеся на диске, обычно имеют различные методы кодирования. Используя различные методы кодирования, одни и те же символы будут иметь разные двоичные представления. На самом деле, потоки персонажей работают так:
Поток выходных символов: преобразовать последовательность символов (на самом деле последовательность символов Unicode) в последовательность байтов в указанном методе кодирования, а затем напишите в файл;
Поток ввода символов: декодировать последовательность байтов, которые будут считываться в соответствующую последовательность символов (на самом деле последовательность символов Unicode) в указанном методе кодирования, чтобы его можно было хранить в памяти.
Мы используем демонстрацию, чтобы углубить наше понимание этого процесса. Пример кода заключается в следующем:
Import java.io.fileWriter; Import java.io.ioexception; открытый класс FileWriterDemo {public static void main (string [] args) {fileWriter fileWriter = null; try {try {fileWriter = new FileWriter ("demo.txt"); filewriter.write ("demo"); } наконец {filewriter.close (); }} catch (ioException e) {e.printstacktrace (); }}}В приведенном выше коде мы используем файл автора для написания четырех символов «демонстрация» в demo.txt. Мы используем шестнадцатеричный редактор WinHex для просмотра содержания Demo.txt:
Как видно из приведенного выше рисунка, «Демо», которую мы написали, кодируется как «64 65 6d 6f», но мы явно не указали метод кодирования в приведенном выше коде. Фактически, когда мы не указываем, метод кодирования символов операционной системы используется для кодирования символов, которые мы хотим написать.
Поскольку поток символов фактически должен завершить преобразование последовательности символов Unicode в соответствующий метод кодирования перед выводом, он будет использовать буфер памяти для хранения конвертированной последовательности байтов и ждать завершения преобразования перед написанием в файл диска вместе.
4. Разница между потоком символов и байтовым потоком
После приведенного выше описания мы можем знать, что основные различия между потоками байтов и потоками символов отражаются в следующих аспектах:
Основной единицей работы по потоку байта является байты; Основной единицей работы потока символов является символы Unicode.
По умолчанию байтовый поток не использует буферы; Поток символов использует буферы.
Байтовый поток обычно используется для обработки двоичных данных. Фактически, он может обрабатывать любой тип данных, но не поддерживает написание или чтение символов Unicode напрямую; Поток символов обычно обрабатывает текстовые данные, которые поддерживают написание и чтение символов Unicode.
Вышесказанное - некоторые из моих пониманий потоков персонажей и байтовых потоков на Java. Если есть какие -либо неясные или неточные описания, я надеюсь, что вы сможете исправить их. Спасибо.