Главная страница
Навигация по странице:

  • Что делает метод read

  • Почему он возвращает int а не byte Почему он не может возвращать byte

  • Что делает метод write

  • Ревью 5. Что такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4


    Скачать 110.73 Kb.
    НазваниеЧто такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4
    АнкорРевью 5
    Дата24.12.2022
    Размер110.73 Kb.
    Формат файлаdocx
    Имя файлаРевью 5.docx
    ТипДокументы
    #861326
    страница3 из 13
    1   2   3   4   5   6   7   8   9   ...   13

    Какие особенности NIO вы знаете?


    Каналы и селекторы: NIO поддерживает различные типы каналов. Канал является абстракцией объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), что позволяет передавать данные с более высокой скоростью. Каналы не блокируются и поэтому Java предоставляет еще такие инструменты, как селектор, который позволяет выбрать готовый канал для передачи данных, и сокет, который является инструментом для блокировки.

    Буферы: имеет буферизация для всех классов-обёрток примитивов (кроме Boolean). Появился абстрактный класс Buffer, который предоставляет такие операции, как clear, flip, mark и т.д. Его подклассы предоставляют методы для получения и установки данных.

    Кодировки: появились кодеры и декодеры для отображения байт и символов Unicode.

    Что делает метод read?


    Класс InputStream

    int read(): возвращает целочисленное представление следующего байта в потоке. Когда в потоке не останется доступных для чтения байтов, данный метод возвратит число -1

    int read(byte[] buffer): считывает байты из потока в массив buffer. После чтения возвращает число считанных байтов. Если ни одного байта не было считано, то возвращается число -1

    int read(byte[] buffer, int offset, int length): считывает некоторое количество байтов, равное length, из потока в массив buffer. При этом считанные байты помещаются в массиве, начиная со смещения offset, то есть с элемента buffer[offset]. Метод возвращает число успешно прочитанных байтов.

    Класс Reader

    int read(): возвращает целочисленное представление следующего символа в потоке. Если таких символов нет, и достигнут конец файла, то возвращается число -1

    int read(char[] buffer): считывает в массив buffer из потока символы, количество которых равно длине массива buffer. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1

    int read(CharBuffer buffer): считывает в объект CharBuffer из потока символы. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1

    absract int read(char[] buffer, int offset, int count): считывает в массив buffer, начиная со смещения offset, из потока символы, количество которых равно count

    Почему он возвращает int а не byte? Почему он не может возвращать byte?


    Тип Int необходим для возможности выделять признак конца потока. Т.к. тип byte является знаковым, то его диапазон составляет [-128; 127], ([1000_0000; 0111_1111]), но если этот байт поместить в младший байт типа int, то диапазон значений становится [0; 255].

    Тип данных int в Java является дополненнным до двух целым числом и использует 32 бита вместо 8. т. е. метод read() возвращает не само значение byte, а его представление в 32х битном виде.

    Диапазон byte в Java лежит от -128 до 127, а возвращаемое значение метода read() лежит в диапазоне от 0 до 255.

    Что происходит с числом byte в методе read

    Чтобы получить представление byte в int в методе read() используется побитовое «И» c числом 255, т. е. убираем лидирующие единицы.
    | число | 32 bit |

    ----- --------------------------------

    | -3 | 11111111111111111111111111111101 |

    И

    | 255 | 00000000000000000000000011111111 |

    =

    | 253 | 00000000000000000000000011111101 |

    Чтобы из представления получить обратно значение byte в int, нужно выполнить обратную операцию побитовое «ИЛИ» c числом -256, т. е. добавляем лидирующие единицы.
    | число | 32 bit |

    ----- --------------------------------

    | 253 | 00000000000000000000000011111101 |

    ИЛИ

    | -256 | 11111111111111111111111100000000 |

    =

    | -3 | 11111111111111111111111111111101 |

    Что происходит с числом byte == -1 в методе read()

    То же самое: убираем лидирующие единицы.
    | число | 32 bit |

    ----- --------------------------------

    | -1 | 11111111111111111111111111111111 |

    И

    | 255 | 00000000000000000000000011111111 |

    =

    | 255 | 00000000000000000000000011111111 |

    Что делает метод write?


    Класс OutputStream

    void write(int b): записывает в выходной поток один байт, который представлен целочисленным параметром b

    void write(byte[] buffer): записывает в выходной поток массив байтов buffer.

    void write(byte[] buffer, int offset, int length): записывает в выходной поток некоторое число байтов, равное length, из массива buffer, начиная со смещения offset, то есть с элемента buffer[offset].

    Класс Writer

    void write(int c): записывает в поток один символ, который имеет целочисленное представление

    void write(char[] buffer): записывает в поток массив символов

    absract void write(char[] buffer, int off, int len) : записывает в поток только несколько символов из массива buffer. Причем количество символов равно len, а отбор символов из массива начинается с индекса off
    1   2   3   4   5   6   7   8   9   ...   13


    написать администратору сайта