SlideShare a Scribd company logo
Язык Java
java.nio
Введение
   Java.nio
    ◦ j2se 1.4 (Merlin)
 IO не обеспечивал достаточный уровень
  производительности при работе с
  большими объемами данных
 IO не предоставлял следующие
  возможности при работе с файлами
    ◦ Блокировка файлов
    ◦ Неблокирующий ввод/вывод
    ◦ Отображение в память
Buffers
 Буфер – контейнер для данных
  фиксированного размера
 Для каждого из примитивных типов
  существуют свои буферы
    ◦ CharBuffer, IntBuffer, DoubleBuffer,
      ShortBuffer, LongBuffer, FloatBuffer,
      ByteBuffer (MappedByteBuffer)
 Все классы буферов позволяют
  проводить конвертацию из байтовых
  массивов и обратно
 Буферы связаны с каналами
Атрибуты буфера
   Емкость (Capacity)
    ◦ Максимальное количество
      элементов, которое может содержать буфер.
      Задается на этапе создания буфера. Не
      изменяется.
   Предел (Limit)
    ◦ Количество доступных элементов в буфере.
   Позиция (Position)
    ◦ Позиция элемента, который может быть
      считан или записан.
   Метка (Mark)
    ◦ Сохраненная позиция, на которую можно
      вернуться
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( );
Доступ к содержимому буфера
   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);
    }
Работа с буфером
 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( );
      }
Работа с массивами данных
   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)
   }
Пример использования
    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));
Создание буферов
   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( )
   }
Создание копий буферов
   public abstract class CharBuffer
    extends Buffer implements
    CharSequence, Comparable{
    ◦ public abstract CharBuffer duplicate( );
    ◦ public abstract CharBuffer
      asReadOnlyBuffer( );
    ◦ public abstract CharBuffer slice( );
   }
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)
Класс ByteOrder
 Служит для определения порядка
  следования байт
 public final class ByteOrder{
    ◦ public static final ByteOrder BIG_ENDIAN
    ◦ public static final ByteOrder
      LITTLE_ENDIAN
    ◦ public static ByteOrder nativeOrder( )
    ◦ public String toString( )
   }
Методы для представления в
виде разного типа данных
   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( );
Методы для представления в
виде разного типа данных
    ◦   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);
   }
Язык Java
java.nio.channels

КАНАЛЫ
Интерфейс channel
public interface Channel
{
    ◦ public boolean isOpen( );
    ◦ public void close( ) throws IOException;
   }
Открытие канала
   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( );
Связь каналов с потоками
   FileInputStream
    ◦ ByteChannel – двунаправленный
    ◦ Позволяет производить только чтение
   FileOutputStream
    ◦ ByteChannel – двунаправленный
    ◦ Позволяет проводить только чтение
   RandomAccessFile
    ◦ ByteChannel – двунаправленный
    ◦ Позволяет проводить чтение и запись
Одновременная работа с
несколькими буферами
   ScatteringByteChannel
    ◦ public interface ScatteringByteChannel
      extends ReadableByteChannel{
      public long read (ByteBuffer [] dsts) throws
       IOException;
      public long read (ByteBuffer [] dsts, int offset,
       int length) throws IOException;
    ◦}
Одновременная работа с
несколькими буферами
   GatheringByteChannel
    ◦ public interface GatheringByteChannel
      extends WritableByteChannel{
      public long write(ByteBuffer[] srcs) throws
       IOException;
      public long write(ByteBuffer[] srcs, int offset, int
       length) throws IOException;
    ◦}
Пример работы с FileChannel
   FileOutputStream fo=null;
       FileChannel inChannel=null;
       FileChannel outChannel=null;
       FileInputStream fi=null;
       try{
          try{
             fi=new FileInputStream(args[0]);
             inChannel=fi.getChannel();
             fo=new FileOutputStream(args[1]);
             outChannel=fo.getChannel();
             ByteBuffer
    bb=ByteBuffer.allocate(1024);
Пример работы с FileChannel
(продолжение)
    int i=0;
     while((i=inChannel.read(bb))!=0) {
            bb.flip();
            outChannel.write(bb);
    }
    inChannel.position(0);
    inChannel.read(bb);
    bb.flip();
    ByteBuffer bb3=ByteBuffer.allocate(10);
    bb3.put(0,(byte)'-').put((byte)'-').put((byte)'-
    ').put((byte)'-').put((byte)'-').put((byte)'-
    ').put((byte)'-').flip();
    ByteBuffer bb1=bb.duplicate();
    ByteBuffer bb2=bb.duplicate();
    outChannel.write(new
    ByteBuffer[]{bb3,bb,bb1,bb2});
Пример работы с FileChannel
(продолжение)
     }finally{
          if(inChannel!=null)
                   inChannel.close();
          if(outChannel!=null)
                   outChannel.close();
          if(fo!=null)
                   fo.close();
          if(fi!=null)
                   fi.close();
       }
    }catch(Exception e){
             System.out.println(e);
    }
FileChannel

ОТОБРАЖЕНИЕ ФАЙЛА В
ПАМЯТЬ
Методы для отображения файла
в память
 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
Пример использования
MappedByteBuffer
(MapMode.READ_WRITE)
   RandomAccessFile fi=null;
    FileChannel fc=null;
    MappedByteBuffer mbb=null;
    try{
        try{
           fi=new
    RandomAccessFile(args[0],"rw");
           fc=fi.getChannel();
         mbb=fc.map(FileChannel.MapMode.REA
    D_WRITE, 2, fc.size());
          mbb.order(ByteOrder.LITTLE_ENDIAN);
          CharBuffer cb=mbb.asCharBuffer();
          cb.position(0);
          cb.put('h').put('e').put('l').put('l').put('o');
Пример использования
MappedByteBuffer
    }finally{
         if(fc!=null)
                fc.close();
         if(fi!=null)
                 fi.close();
      }
    }catch(Exception e){
        System.out.println(e);
    }
Пример использования
MappedByteBuffer
(MapMode.PRIVATE)
   RandomAccessFile fi=null;
    FileChannel fc=null;
    MappedByteBuffer mbb=null;
    try{
       try{
         fi=new RandomAccessFile(args[0],"rw");
         fc=fi.getChannel();
    mbb=fc.map(FileChannel.MapMode.PRIVAT
    E, 2, fc.size());
          mbb.order(ByteOrder.LITTLE_ENDIAN);
          CharBuffer cb=mbb.asCharBuffer();
          cb.position(0);
          cb.put('1').put('1').put('1').put('1').put('1');
Пример использования
MappedByteBuffer
(MapMode.PRIVATE)
             cb.position(0);
    System.out.println(cb.toString());
            }finally{
                if(fc!=null)
                    fc.close();
                if(fi!=null)
                    fi.close();
            }
         }catch(Exception e)
         {
            System.out.println(e);
         }
Вопросы
e-mail: a.bovanenko@gmail.com

КОНЕЦ

More Related Content

PDF
"Web Audio Api", Анатолий Найда, MoscowJS 27
PPTX
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
PDF
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
PDF
Семинар 9. Параллельное программирование на MPI (часть 2)
PDF
Введение в потоки питона
PPTX
file handling in c
PDF
RDSDataSource: Чистые тесты на Swift
PDF
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
"Web Audio Api", Анатолий Найда, MoscowJS 27
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
Семинар 9. Параллельное программирование на MPI (часть 2)
Введение в потоки питона
file handling in c
RDSDataSource: Чистые тесты на Swift
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)

What's hot (20)

PDF
RDSDataSource: Promises
PDF
Семинар 10. Параллельное программирование на MPI (часть 3)
PPT
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
PDF
Linux (pipes)
PPTX
file handling in c++
PPT
Dynamic Language Runtime
PDF
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
PPTX
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
PDF
Reform: путь к лучшему ORM
PDF
Python и Cython
PDF
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
PDF
Optimization of Automata-Based Programs by means of Requirements Transformati...
PPT
Hl2008 Hp Server Design 169
PDF
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
PDF
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
PDF
Леонид Васильев "Python в инфраструктуре поиска"
PPTX
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
PDF
Семинар 8. Параллельное программирование на MPI (часть 1)
PPT
Web осень 2012 лекция 3
RDSDataSource: Promises
Семинар 10. Параллельное программирование на MPI (часть 3)
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Linux (pipes)
file handling in c++
Dynamic Language Runtime
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Reform: путь к лучшему ORM
Python и Cython
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Optimization of Automata-Based Programs by means of Requirements Transformati...
Hl2008 Hp Server Design 169
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
Леонид Васильев "Python в инфраструктуре поиска"
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Семинар 8. Параллельное программирование на MPI (часть 1)
Web осень 2012 лекция 3
Ad

Viewers also liked (9)

ODP
PDF
PHP introduction
PDF
Python. Строки
ODP
Исключительные ситуации
PDF
Python. Введение
PDF
Python sqlite3
PDF
File. Java
PDF
Python. re
PDF
python dict
PHP introduction
Python. Строки
Исключительные ситуации
Python. Введение
Python sqlite3
File. Java
Python. re
python dict
Ad

Similar to Nio java (20)

PDF
PPT
Лекция 5
PDF
Консольные приложения на Go
PPTX
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
PDF
JPoint 2016 - Etudes of DIY Java profiler
PDF
Продолжаем говорить о микрооптимизациях .NET-приложений
PPTX
Everything you wanted to know about writing async, high-concurrency HTTP apps...
PPTX
PDF
Иван Пузыревский — Введение в асинхронное программирование
PPT
5. java lecture io
PPTX
Григорий Демченко, Асинхронность и неблокирующая синхронизация
ODP
Программирование Linux
ODP
Программирование Linux
ODP
Программирование Linux
PDF
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
PPTX
Asynchrony and coroutines
PPTX
Deep Dive C# by Sergey Teplyakov
PPT
Root Conf2009 Fin
PPT
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
PDF
ekbpy'2012 - Михаил Коробов - Python 3
Лекция 5
Консольные приложения на Go
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
JPoint 2016 - Etudes of DIY Java profiler
Продолжаем говорить о микрооптимизациях .NET-приложений
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Иван Пузыревский — Введение в асинхронное программирование
5. java lecture io
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Программирование Linux
Программирование Linux
Программирование Linux
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Asynchrony and coroutines
Deep Dive C# by Sergey Teplyakov
Root Conf2009 Fin
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ekbpy'2012 - Михаил Коробов - Python 3

More from Alexey Bovanenko (20)

PPT
Конвертация строковых данных в числовые
ODP
PPT
Обработка символов в языке C
ODP
PPTX
Javascript functions
PPTX
Javascript String object
ODP
ZIP, GZIP Streams in java
PDF
Конструктор копирования
PDF
Tempale Intro
PDF
transaction. php
PDF
cookie. support by php
PDF
php sessions
ODP
Java IO. Streams
ODP
Regular Expressions
ODP
Classes: Number, String, StringBuffer, StringBuilder
ODP
Объект Logger
ODP
Drag And Drop Windows Forms
PDF
enum. Java.
PDF
Files. Php.
PDF
Конвертация строковых данных в числовые
Обработка символов в языке C
Javascript functions
Javascript String object
ZIP, GZIP Streams in java
Конструктор копирования
Tempale Intro
transaction. php
cookie. support by php
php sessions
Java IO. Streams
Regular Expressions
Classes: Number, String, StringBuffer, StringBuilder
Объект Logger
Drag And Drop Windows Forms
enum. Java.
Files. Php.

Nio java

  • 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);  }
  • 17. Интерфейс channel public interface Channel { ◦ public boolean isOpen( ); ◦ public void close( ) throws IOException;  }
  • 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; ◦}
  • 22. Пример работы с FileChannel  FileOutputStream fo=null;  FileChannel inChannel=null;  FileChannel outChannel=null;  FileInputStream fi=null;  try{  try{  fi=new FileInputStream(args[0]);  inChannel=fi.getChannel();  fo=new FileOutputStream(args[1]);  outChannel=fo.getChannel();  ByteBuffer bb=ByteBuffer.allocate(1024);
  • 23. Пример работы с FileChannel (продолжение)  int i=0; while((i=inChannel.read(bb))!=0) { bb.flip(); outChannel.write(bb); } inChannel.position(0); inChannel.read(bb); bb.flip(); ByteBuffer bb3=ByteBuffer.allocate(10); bb3.put(0,(byte)'-').put((byte)'-').put((byte)'- ').put((byte)'-').put((byte)'-').put((byte)'- ').put((byte)'-').flip(); ByteBuffer bb1=bb.duplicate(); ByteBuffer bb2=bb.duplicate(); outChannel.write(new ByteBuffer[]{bb3,bb,bb1,bb2});
  • 24. Пример работы с FileChannel (продолжение)  }finally{ if(inChannel!=null) inChannel.close(); if(outChannel!=null) outChannel.close(); if(fo!=null) fo.close(); if(fi!=null) fi.close(); } }catch(Exception e){ System.out.println(e); }
  • 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
  • 27. Пример использования MappedByteBuffer (MapMode.READ_WRITE)  RandomAccessFile fi=null; FileChannel fc=null; MappedByteBuffer mbb=null; try{ try{ fi=new RandomAccessFile(args[0],"rw"); fc=fi.getChannel(); mbb=fc.map(FileChannel.MapMode.REA D_WRITE, 2, fc.size()); mbb.order(ByteOrder.LITTLE_ENDIAN); CharBuffer cb=mbb.asCharBuffer(); cb.position(0); cb.put('h').put('e').put('l').put('l').put('o');
  • 28. Пример использования MappedByteBuffer  }finally{ if(fc!=null) fc.close(); if(fi!=null) fi.close(); } }catch(Exception e){ System.out.println(e); }
  • 29. Пример использования MappedByteBuffer (MapMode.PRIVATE)  RandomAccessFile fi=null; FileChannel fc=null; MappedByteBuffer mbb=null; try{ try{ fi=new RandomAccessFile(args[0],"rw"); fc=fi.getChannel(); mbb=fc.map(FileChannel.MapMode.PRIVAT E, 2, fc.size()); mbb.order(ByteOrder.LITTLE_ENDIAN); CharBuffer cb=mbb.asCharBuffer(); cb.position(0); cb.put('1').put('1').put('1').put('1').put('1');
  • 30. Пример использования MappedByteBuffer (MapMode.PRIVATE)  cb.position(0); System.out.println(cb.toString()); }finally{ if(fc!=null) fc.close(); if(fi!=null) fi.close(); } }catch(Exception e) { System.out.println(e); }