2. Введение
Java.nio
◦ j2se 1.4 (Merlin)
IO не обеспечивал достаточный уровень
производительности при работе с
большими объемами данных
IO не предоставлял следующие
возможности при работе с файлами
◦ Блокировка файлов
◦ Неблокирующий ввод/вывод
◦ Отображение в память
3. Buffers
Буфер – контейнер для данных
фиксированного размера
Для каждого из примитивных типов
существуют свои буферы
◦ CharBuffer, IntBuffer, DoubleBuffer,
ShortBuffer, LongBuffer, FloatBuffer,
ByteBuffer (MappedByteBuffer)
Все классы буферов позволяют
проводить конвертацию из байтовых
массивов и обратно
Буферы связаны с каналами
4. Атрибуты буфера
Емкость (Capacity)
◦ Максимальное количество
элементов, которое может содержать буфер.
Задается на этапе создания буфера. Не
изменяется.
Предел (Limit)
◦ Количество доступных элементов в буфере.
Позиция (Position)
◦ Позиция элемента, который может быть
считан или записан.
Метка (Mark)
◦ Сохраненная позиция, на которую можно
вернуться
5. abstract class Buffer
public final int capacity( )
public final int position( )
public final Buffer position (int newPosition)
public final int limit( )
public final Buffer limit (int newLimit)
public final Buffer mark( )
public final Buffer reset( )
public final Buffer clear( )
public final Buffer flip( )
public final Buffer rewind( )
public final int remaining( )
public final boolean hasRemaining( )
public abstract boolean isReadOnly( );
6. Доступ к содержимому буфера
public abstract class ByteBuffer
extends Buffer implements
Comparable
{
public abstract byte get( );
public abstract byte get (int index);
public abstract ByteBuffer put (byte b);
public abstract ByteBuffer put (int
index, byte b);
}
7. Работа с буфером
buffer.put(0,
(byte)‘H').put((byte)‘e').put((byte)’l’).put((byte)’l’).p
ut((byte)’o’);
Изменение буфера
◦ buffer.limit(buffer.position( )).position(0);
◦ buffer.flip( );
Использование данных в буфере
◦ for (int i = 0; buffer.hasRemaining( ), i++) {
byteArray [i] = buffer.get( );
}
◦ int count = buffer.remaining( );
for (int i = 0; i < count, i++) {
byteArray [i] = buffer.get( );
}
8. Работа с массивами данных
public abstract class CharBuffer
extends Buffer implements CharSequence,
Comparable
{
◦ public CharBuffer get (char [] dst)
◦ public CharBuffer get (char [] dst, int offset, int length)
◦ public final CharBuffer put (char[] src)
◦ public CharBuffer put (char [] src, int offset, int length)
◦ public CharBuffer put (CharBuffer src)
◦ public final CharBuffer put (String src)
◦ public CharBuffer put (String src, int start, int end)
}
9. Пример использования
CharBuffer
cb=CharBuffer.allocate(20);
cb.append("Hello, world");
cb.put("!!!!");
cb.flip();
char[] c=new char[16];
cb.get(c);
System.out.println(Arrays.toString(c));
10. Создание буферов
public abstract class CharBuffer
extends Buffer implements
CharSequence, Comparable{
◦ public static CharBuffer allocate (int capacity)
◦ public static CharBuffer wrap (char [] array)
◦ public static CharBuffer wrap (char [] array,
int offset, int length)
◦ public final boolean hasArray( )
◦ public final char [] array( )
◦ public final int arrayOffset( )
}
11. Создание копий буферов
public abstract class CharBuffer
extends Buffer implements
CharSequence, Comparable{
◦ public abstract CharBuffer duplicate( );
◦ public abstract CharBuffer
asReadOnlyBuffer( );
◦ public abstract CharBuffer slice( );
}
12. ByteBuffer
Лежит в основе всех буферов
Преобразование из ByteBuffer
◦ public abstract class ByteBuffer
extends Buffer implements Comparable{
public abstract CharBuffer asCharBuffer( );
public abstract ShortBuffer asShortBuffer( );
public abstract IntBuffer asIntBuffer( );
public abstract LongBuffer asLongBuffer( );
public abstract FloatBuffer asFloatBuffer( );
public abstract DoubleBuffer asDoubleBuffer( );
◦ }
Перед преобразованием необходимо установить
порядок байт
public final ByteOrder order( )
public final ByteBuffer order (ByteOrder bo)
13. Класс ByteOrder
Служит для определения порядка
следования байт
public final class ByteOrder{
◦ public static final ByteOrder BIG_ENDIAN
◦ public static final ByteOrder
LITTLE_ENDIAN
◦ public static ByteOrder nativeOrder( )
◦ public String toString( )
}
14. Методы для представления в
виде разного типа данных
public abstract class ByteBuffer extends Buffer
implements Comparable{
◦ public abstract char getChar( );
◦ public abstract char getChar (int index);
◦ public abstract short getShort( );
◦ public abstract short getShort (int index);
◦ public abstract int getInt( );
◦ public abstract int getInt (int index);
◦ public abstract long getLong( );
◦ public abstract long getLong (int index);
◦ public abstract float getFloat( );
◦ public abstract float getFloat (int index);
◦ public abstract double getDouble( );
15. Методы для представления в
виде разного типа данных
◦ public abstract double getDouble (int index);
◦ public abstract ByteBuffer putChar (char value);
◦ public abstract ByteBuffer putChar (int index, char value);
◦ public abstract ByteBuffer putShort (short value);
◦ public abstract ByteBuffer putShort (int index, short value);
◦ public abstract ByteBuffer putInt (int value);
◦ public abstract ByteBuffer putInt (int index, int value);
◦ public abstract ByteBuffer putLong (long value);
◦ public abstract ByteBuffer putLong (int index, long value);
◦ public abstract ByteBuffer putFloat (float value);
◦ public abstract ByteBuffer putFloat (int index, float value);
◦ public abstract ByteBuffer putDouble (double value);
◦ public abstract ByteBuffer putDouble (int index, double
value);
}
18. Открытие канала
SocketChannel
◦ SocketChannel sc = SocketChannel.open( );
◦ sc.connect (new InetSocketAddress ("somehost",
someport));
ServerSocketChannel
◦ ServerSocketChannel ssc =
ServerSocketChannel.open( );
◦ ssc.socket( ).bind (new InetSocketAddress
(somelocalport));
DatagramChannel
◦ DatagramChannel dc = DatagramChannel.open( );
FileChannel
◦ RandomAccessFile raf = new RandomAccessFile
("somefile", "r");
◦ FileChannel fc = raf.getChannel( );
19. Связь каналов с потоками
FileInputStream
◦ ByteChannel – двунаправленный
◦ Позволяет производить только чтение
FileOutputStream
◦ ByteChannel – двунаправленный
◦ Позволяет проводить только чтение
RandomAccessFile
◦ ByteChannel – двунаправленный
◦ Позволяет проводить чтение и запись
20. Одновременная работа с
несколькими буферами
ScatteringByteChannel
◦ public interface ScatteringByteChannel
extends ReadableByteChannel{
public long read (ByteBuffer [] dsts) throws
IOException;
public long read (ByteBuffer [] dsts, int offset,
int length) throws IOException;
◦}
21. Одновременная работа с
несколькими буферами
GatheringByteChannel
◦ public interface GatheringByteChannel
extends WritableByteChannel{
public long write(ByteBuffer[] srcs) throws
IOException;
public long write(ByteBuffer[] srcs, int offset, int
length) throws IOException;
◦}
26. Методы для отображения файла
в память
public abstract MappedByteBuffer
map(MapMode mode, long
position, long size)
public static class MapMode
◦ public static final MapMode READ_ONLY
◦ public static final MapMode
READ_WRITE
◦ public static final MapMode PRIVATE