Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница58 из 90
1   ...   54   55   56   57   58   59   60   61   ...   90
ГЛАВА
Исследование Начиная с версии 1.4 язык Java предоставляет вторую систему ввода-вывода под названием NIO (сокращение от New I / O — новый ввод-вывод). Она поддерживает ориентированный на буферы канальный подход к операциям ввода-вывода. С появлением JDK 7 система NIO была существенно расширена, и теперь она оказывает улучшенную поддержку для средств обработки файлов и файловых систем. Фактически, изменения столь существенны, что ныне нередко используется термин N10.2. Благодаря возможностям, предоставленным новыми файловыми классами NIO, ожидается, что система NIO станет еще более важной частью обработки файлов. Данная глава исследует некоторые основные характеристики системы
NIO, включая ее новые возможности по обработке файлов.
Классы Рассматриваемые классы содержатся в следующих пакетах (табл. Таблица 20.1. Пакеты, содержащие классы N10
Пакет
Назначение
java.nio
j a v a .n i o .channels
java.nio
java.nio
java.nio
java.nio
java.nio
,channels.spi
,charset
,c h arset.spi
.
file
.fil e Пакет верхнего уровняв системе NIO. Инкапсулирует различные типы буферов, содержащих данные, с которыми работает система Поддерживает каналы, открывающие соединения ввода- вывода
Поддерживает провайдеры служб для каналов
Инкапсулирует наборы символов. Также поддерживает работу кодировщиков и декодеров, преобразующих символы в байты и байты в символы соответственно
Поддерживает провайдеры служб для наборов символов
Обеспечивает поддержку для файлов. (Добавлено b
JDK Обеспечивает поддержку для атрибутов файлов.
(Добавлено в JDK Поддержка провайдеров служб для файловых систем. Добавлено в JDK Прежде чем приступить к рассмотрению системы NIO, следует понять, что эта система не предназначена для замены классов ввода-вывода, хранящихся в пакете j a v a . io , о которых шла речь в главе 19. Наоборот, классы NIO дополняют стандартную систему ввода-вывода, предлагая альтернативный принцип, применение которого в некоторых случаях может быть предпочтительным Зак 303 0


6 4 Часть II. Библиотека Основы Система NIO построена на двух фундаментальных элементах буферах и каналах. Буфер (buffer) хранит данные, а канал (channel) представляет открытое соединение с устройством ввода-вывода — с файлом или сокетом. В общем случае для использования системы NIO необходимо получить канал для устройства ввода- вывода и буфер для хранения данных. После этого выбудете работать с буфером, вводя или выводя данные по мере необходимости. В следующих разделах мы рассмотрим подробно буферы и каналы.
Буферы
Буферы определены в пакете j a v a . n i o . Все буферы являются подклассами класса Buf f e r , который определяет общие функциональные возможности, характерные для каждого буфера, — текущая позиция, предел и емкость. Текущая позиция
(current position) представляет собой индекс в буфере, с которого в следующий раз начнется операция чтения или записи данных. Текущая позиция перемещается после выполнения большинства операций чтения или записи. Предел (limit) представляет собой значение индекса для вставки в последнюю допустимую ячейку буфера. Емкость определяет количество элементов, которые может хранить буфер. Предел зачастую равнозначен емкости буфера. Класс Buf f e r также поддерживает метку и сброс. Он определяет несколько методов, перечисленных в табл. Таблица 20.2. Методы, определенные в классе

B u f f e r
Метод
Описание
abstract Object ar­
ray ()
abstract int
a r rayOffset()
final int c a p a c i t y ()
final Buffer c l e a r ()
final Buffer flip()
abstract boolean has
A r r a y ()
final boolean
h a s R emaining()
abstract boolean
i s Direct()
abstract boolean Если вызывающий буфер поддерживается массивом, возвращает ссылку на массив. В противном случае передается исключение
UnsupportedOperationException. Если массив доступен только для чтения, передается исключение
ReadOnlyBufferException
Если вызывающий буфер поддерживается массивом, возвращает индекс первого элемента. В противном случае передается исключение
UnsupportedOperationException. Если массив доступен только для чтения, передается исключение
ReadOnlyBufferException
Возвращает количество элементов, которые может хранить вызывающий буфер
Очищает вызывающий буфер и возвращает ссылку на него
Устанавливает предел вызывающего буфера по текущей позиции и сбрасывает текущую позицию до нуля. Возвращает ссылку на буфер
Возвращает значение
true, если вызывающий буфер поддерживается массивом, доступным для чтения и записи. В противном случае возвращает значение Возвращает значение
true, если существуют элементы, оставшиеся в вызывающем буфере. В противном случае возвращает значение f a l s Возвращает значение
true, если вызывающий буфер прямой — другими словами, операции ввод-вывода выполняются с ним напрямую. В противном случае возвращает значение Возвращает значение
true, если вызывающий буфер является буфером только для чтения. В противном случае возвращает значение
false
Глава 20. Исследование N10
6 4 Окончание табл. 20.2

Метод
Описание
Возвращает предел вызывающего буфера
Устанавливает предел вызывающего буфера в п.
Возвращает ссылку на буфер
Устанавливает метку и возвращает ссылку на вызывающий буфер
Возвращает текущую позицию
Устанавливает текущую позицию буфера в п.
Возвращает ссылку на буфер
Возвращает количество элементов, доступных до достижения предела. Другими словами, возвращает предел минус текущая позиция
Сбрасывает текущую позицию вызывающего буфера в предварительно установленную метку. Возвращает ссылку на буфер
Устанавливает позицию вызывающего буфера в нуль.
____________ Возвращает ссылку на буфер______________________________
От класса
Buffer происходят следующие специализированные классы буферов, тип хранимых данных которых можно определить по их именам int l i m i t ()

final Buffer
l i m i t (int
n)
final Buffer mark()
final int p o s i t i o n ()
final Buffer
position(int
n)
int rem a i n i n g ()
final Buffer reset ()
final Buffer r e w i n d (Класс
MappedByteBuf f er является подклассом класса
ByteBuf fer и используется для отображения файла в виде буфера.
Каждый буфер предоставляют различные методы get
() и put
( ) , которые позволяют получать данные из буфера или вносить их в него. (Конечно, если буфер предназначен только для чтения, метод put
() недоступен) В табл. 20.3 представлены методы get (
) и put ()
, определенные классом
ByteBuf fer. Другие классы буферов имеют похожие методы. Все классы буферов также поддерживают методы, выполняющие различные операции с буфером. Например, с помощью метода allocate
() можно вручную зарезервировать память под буфер. С помощью метода wrap
() можно организовать массив внутри буфера. С помощью метода slice
() можно создать подпоследовательность буфера.
Таблица 20.3. Методы
g e t (
) и
p u t ( ) , определенные в классе

B y t e B u f f e r
Метод
Описание
abstract byte g e t ()
ByteBuffer get(byte значения значения начало число)
Возвращает байт в текущей позиции
Копирует вызывающий буфер в массивна который указывает параметр значения.
Возвращает ссылку на буфер. Если в буфере не осталось значения элементов, передается исключение
BufferUnderflowException
Копирует число элементов из вызывающего буфера в массивна который указывает параметр значения,
начиная с индекса, заданного в параметре начало.
Возвращает ссылку на буфер. Если в буфере не осталось число элементов, передается исключение
Buf
f
erUnder
f1owExcept
ion_______

6 4 Часть II. Библиотека Окончание табл. 20.3

Метод
Описание
abstract byte get(int индекс)
abstract ByteBufferput(byte
b)
final ByteBufferput(byte значения значения число int начало индекс Возвращает из вызывающего буфера байт по индексу, заданному в параметре индекс
Копирует в текущую позицию вызывающего буфера. Возвращает ссылку на буфер. Если буфер заполнен, передается исключение

ferOverflowExcept Копирует все элементы массива значения в вызывающий буфер начиная с текущей позиции. Возвращает ссылку на буфер. Если буфер не может вместить все элементы, передается исключение
f
f
erOver
f1owExc
ept
i Копирует число элементов из массива значения начиная с позиции начало, в вызывающий буфер. Возвращает ссылку на буфер. Если буфер не может хранить все элементы, передается исключение
BufferOverflowException
Копирует элементы изв вызывающий буфер начиная с текущей позиции. Если буфер не может хранить все элементы, передается исключение

f
erOver
f
lowExcept
ion. Возвращает ссылку на буфер
Копирует в позицию вызывающего буфера, заданную параметром индекс.
Возвращает ссылку на буфер_______________________________________
Каналы
Каналы определены в пакете java.
io.
channels. Капал (channel) представляет открытое соединение с источником или назначением ввода-вывода. Классы каналов реализуют интерфейс
Channel, расширяющий интерфейс
Closeable и, начиная с JDK 7, интерфейс
AutoCloseable. При реализации интерфейса каналы могут управляться новым оператором JDK 7 try-c- ресурсами При использовании в блоке оператора с ресурсами канал закрывается автоматически, когда он больше ненужен. (Более подробная информация об операторе try с ресурсами приведена в главе Один из способов получения канала подразумевает вызов метода getChan­
nel
() объекта, поддерживающего каналы. Например, метод get
Channel
() поддерживается следующими классами ввода-вывода.
DatagramSocket
FilelnputStream
FileOutputStream
RandomAccessFile
ServerSocket
Socket
Специфический тип возвращаемого канала зависит от типа объекта, для которого вызывается метод get
Channel ()
. Например, при вызове для объекта класса
FilelnputStream, FileOutputStream или
RandomAccessFile, метод getChannel
() возвращает канал типа
FileChannel. При вызове для объекта класса
Socket, этот метод возвращает канал типа
Socket Еще один способ получения канала подразумевает использование одного из статических методов, определенных классом
Files, который был добавлен в комплекте JDK 7. Например, используя класс
Files, вы можете получить байтовый канал при вызове метода newByt eChanne
1 ()
. Он возвращает канал типа
Глава 20. Исследование N10
6 4 5
SeekableByteChannel, являющегося интерфейсом, реализованным классом
FileChannel. Подробнее класс
Files рассматривается далее в этой главе.)
Каналы вроде
FileChannel и
Socket
Channel поддерживают различные методы read
() и write
(), которые позволяют выполнять операции ввода-вывода через канал. Например, в табл. 20.4 показано несколько методов read (
) и write (определенных для класса Таблица 20.4. Методы
r e a d ( ) и
w r i t e ( )
, определенные в классе
F i l e C h a n n e l
Метод
Описание
abstract int
read(ByteBuffer
bb)
throws IOException
abstract int
read(ByteBuffer
bb,
long начало
IOException
abstract int
write(ByteBuffer
bb)
throws IOException
abstract int
write(ByteBuffer
bb,
long начало Считывает байты из вызывающего канала в
bb
до тех пор, пока буфер не будет заполнен или пока не закончатся входные данные. Возвращает количество прочитанных байтов Начиная с позиции, определяемой при помощи параметра начало считывает байты из вызывающего канала в
bb
до тех пор, пока буфер не будет заполнен или пока не закончатся входные данные. Текущая позиция не изменяется. Возвращает количество прочитанных байтов или значение -1, если начальная позиция (параметр начало окажется заграницами файла Записывает содержимое байтового буфера в вызывающий канал начиная с текущей позиции. Возвращает количество записанных байтов
Начиная с позиции файла, определяемой при помощи параметра начало записывает содержимое байтового буфера в вызывающий канал. Текущая позиция не изменяется. Возвращает количество записанных байтов
Все каналы поддерживают дополнительные методы, предоставляющие доступ к каналу и позволяющие управлять им. Например, канал класса
F i l e C h a n n e l поддерживает методы для получения и установки текущей позиции, передачи информации между файловыми каналами, получения текущего размера канала и его блокировки. Начиная с JDK 7 класс
F i l e C h a n n e l предоставляет статический метод o p e n ( )
, который открывает файл и возвращает канал для него. Это обеспечивает другой способ получения канала. Класс
F i l e C h a n n e l предоставляет также метод шар ()
, с помощью которого можно соотнести файл с буфером.
Наборы символов и селекторы
Система NIO использует наборы символов и селекторы. Набор символов (charset) определяет способ соотнесения байтов с символами. С помощью кодировщика (encoder) можно зашифровать последовательность символов в виде байтов. Процесс расшифровки производится с помощью декодера (decoder). Наборы символов, кодировщики и декодеры поддерживаются классами, определенными в пакете
j
ava.
nio.
charset. Поскольку кодировщики и декодеры предлагаются по умолчанию, работать с наборами символов явным образом вам придется очень редко.
Селектор (selector) обеспечивает возможность многоканального ввода-вывода на основе ключей без применения блокировки. Другими словами, с помощью селекторов можно выполнять операции ввода-вывода при помощи нескольких каналов. Селекторы поддерживаются классами, определенными в пакете java.nio. channels. Селекторы чаще всего применяются в каналах на основе сокетов.
В этой главе мы не будем использовать наборы символов или селекторы, однако их применение может оказаться очень полезным в ряде приложений
Дополнения, внесенные в N10 (комплект JDK Начиная с JDK 7 система NIO была существенно расширена и усовершенствована. Кроме поддержки оператора t r y - с - ресурсами (который обеспечивает автоматическое управление ресурсами, усовершенствования включают три новых пакета
(j ava.
nio .
file, j ava .
nio.
f ile.
attribute и j ava.
nio.file, spi), несколько новых классов, интерфейсов и методов, а также прямую поддержку для потокового ввода-вывода. Дополнения существенно расширили способы применения NIO, особенно с файлами. В следующих разделах описаны некоторые ключевые добавления 4 6 Часть II. Библиотека Интерфейс

P a t Возможно, одним из наиболее важных дополнений к системе NIO является интерфейс
Path, поскольку он инкапсулирует путь к файлу Как вы увидите, интерфейс
Path
— это связующий элемент, объединяющий большинство новых файловых средств N10.2. Он описывает расположение файла в пределах структуры каталогов. Интерфейс
Path находится в пакете j ava .nio.filen наследует интерфейсы
Watchable, Iterable и Интерфейс
Watchable описывает объект, который может быть наблюдаем и изменяем. Он также был добавлен bJDK 7. Интерфейсы
Iterable и
Comparable были описаны ранее в этой книге.
Интерфейс P a th объявляет множество методов для работы с путями. Некоторые из них приведены в табл. 20.5. Обратите особое внимание на метод getN am e (). Он используется для получения элемента пути. Для этого он применяет индекс. Нулевому значению индекса соответствует ближайшая к корню часть пути, являющаяся крайним левым его элементом. Последующие индексы определяют элементы вправо от корня. Количество элементов в пути может быть получено при вызове метода getN am eC ount (). Если вы хотите получить строковое представление всего пути, просто вызовите метод t o S t r i n g (). Обратите внимание, что вы можете распознать относительный и абсолютный путь при помощи метода r e s o l v e (Таблица 20.5. Некоторые методы, определенные в интерфейсе

P a t h
Метод
Описание
boolean
e n d s W i t h (String путь endsWith(Path путь g e t F i leName()

Path getName(int
индекс)
Возвращает значение
true, если вызывающий объект интерфейса
Path заканчивается путем, указанным аргументом путь В противном случае возвращает значение Возвращает значение
true, если вызывающий объект интерфейса
Path заканчивается путем, указанным аргументом путь В противном случае возвращает значение Возвращает имя файла, связанное с вызывающим объектом интерфейса Возвращает объект интерфейса
Path, содержащий имя элемента пути, заданного аргументом индекс в пределах вызывающего объекта. Крайний левый элемент имеет индекс 0. Это элемент, ближайший к корню. Крайний правый элемент имеет индекс
getNameCount () - 1
int Возвращает количество элементов (кроме корневого) в вызывающем объекте интерфейса
Path
Глава 20. Исследование N10
6 4 Окончание табл. 20.5

Метод
Описание
Path g e t P a r e n t ()
Path g e t R o o t ()
boolean isAbsolute()
Path resolve(Path путь путь путь путь)
Path toAbsolutePath()
String to S t r i n g (Возвращает объект интерфейса
Path, содержит весь путь, за исключением имени файла, определенного вызывающим объектом интерфейса Возвращает корневой каталог вызывающего объекта интерфейса Возвращает значение
1   ...   54   55   56   57   58   59   60   61   ...   90


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