SlideShare a Scribd company logo
1 of 31
Язык 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

What's hot

RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Vadim Kruchkov
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeSQALab
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"IT Event
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Optimization of Automata-Based Programs by means of Requirements Transformati...
Optimization of Automata-Based Programs by means of Requirements Transformati...Optimization of Automata-Based Programs by means of Requirements Transformati...
Optimization of Automata-Based Programs by means of Requirements Transformati...Iosif Itkin
 
Hl2008 Hp Server Design 169
Hl2008 Hp Server Design 169Hl2008 Hp Server Design 169
Hl2008 Hp Server Design 169Media Gorod
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Ontico
 
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...Ontico
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Yandex
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3Technopark
 

What's hot (20)

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

Viewers also liked (9)

Pointers
PointersPointers
Pointers
 
PHP introduction
PHP introductionPHP introduction
PHP introduction
 
Python. Строки
Python. СтрокиPython. Строки
Python. Строки
 
Исключительные ситуации
Исключительные ситуацииИсключительные ситуации
Исключительные ситуации
 
Python. Введение
Python. ВведениеPython. Введение
Python. Введение
 
Python sqlite3
Python sqlite3Python sqlite3
Python sqlite3
 
File. Java
File. JavaFile. Java
File. Java
 
Python. re
Python. rePython. re
Python. re
 
python dict
python dictpython dict
python dict
 

Similar to Nio java

Лекция 5
Лекция 5Лекция 5
Лекция 5itc73
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на GoAndrey Smirnov
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorFedor Lavrentyev
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...JavaDayUA
 
Иван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеИван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеYandex
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture ioMERA_school
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutinescorehard_by
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Root Conf2009 Fin
Root Conf2009 FinRoot Conf2009 Fin
Root Conf2009 FinLiudmila Li
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3it-people
 

Similar to Nio java (20)

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

More from Alexey Bovanenko

More from Alexey Bovanenko (20)

Конвертация строковых данных в числовые
Конвертация строковых данных в числовыеКонвертация строковых данных в числовые
Конвертация строковых данных в числовые
 
Assert c
Assert cAssert c
Assert c
 
Обработка символов в языке C
Обработка символов в языке CОбработка символов в языке C
Обработка символов в языке C
 
System c
System cSystem c
System c
 
Javascript functions
Javascript functionsJavascript functions
Javascript functions
 
Javascript String object
Javascript String objectJavascript String object
Javascript String object
 
ZIP, GZIP Streams in java
ZIP, GZIP Streams in javaZIP, GZIP Streams in java
ZIP, GZIP Streams in java
 
Конструктор копирования
Конструктор копированияКонструктор копирования
Конструктор копирования
 
Tempale Intro
Tempale IntroTempale Intro
Tempale Intro
 
transaction. php
transaction. phptransaction. php
transaction. php
 
cookie. support by php
cookie. support by phpcookie. support by php
cookie. support by php
 
php sessions
php sessionsphp sessions
php sessions
 
Java IO. Streams
Java IO. StreamsJava IO. Streams
Java IO. Streams
 
Regular Expressions
Regular ExpressionsRegular Expressions
Regular Expressions
 
Classes: Number, String, StringBuffer, StringBuilder
Classes: Number, String, StringBuffer, StringBuilderClasses: Number, String, StringBuffer, StringBuilder
Classes: Number, String, StringBuffer, StringBuilder
 
Объект Logger
Объект LoggerОбъект Logger
Объект Logger
 
Drag And Drop Windows Forms
Drag And Drop Windows FormsDrag And Drop Windows Forms
Drag And Drop Windows Forms
 
enum. Java.
enum. Java.enum. Java.
enum. Java.
 
Files. Php.
Files. Php.Files. Php.
Files. Php.
 
Apache
ApacheApache
Apache
 

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); }