MappedByteBuffer protobuf

Posted 艺海浮台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MappedByteBuffer protobuf相关的知识,希望对你有一定的参考价值。

NIO

java.nio.MappedByteBuffer
映射字节缓冲区。
    @Test
    public void testFileMapping() {
        try {
            RandomAccessFile raf = new RandomAccessFile("d:/k.txt", "rws");
            FileChannel fc = raf.getChannel();
            MappedByteBuffer buffer = fc.map(MapMode.READ_WRITE, 2, 6);//映射的文件位置
            System.out.println(buffer.get(0));
            System.out.println(buffer.get(1));
            System.out.println(buffer.get(2));
            buffer.put(0, (byte) 97);
            buffer.put(1, (byte) 98);
            buffer.put(2, (byte) 99);
            fc.close();
            raf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 

protobuf

1.protocal buffer,协议缓冲区.
2.串行化技术。
    java.io.Serializable
    ObjectOutputStream / ObjectInputStream
    transient       //临时的
    transaction     //事务
    truncate        //截断.

串行化

[java串行化]
易于使用
效率不高。
没有语言的互操作性。

[手动二进制编码]
效率高
难
跨语言

[人性化文档结构]
xml/json/txt/sax
低效

[PB]
描述语言
编译器
库
2008年发布.

PB下载和使用

0.安装protobuf-win32.zip
    a.解压即可。
    b.配置环境path变量
        path=%path%:c:\myprograms\protocal-2.5.0

1.设计对象
2.描述对象
    [d:/xxx/addressbook.proto]
    package tutorial;
    option java_package = "com.example.tutorial";
    option java_outer_classname = "AddressBookProtos";
    message Person {
        required string name = 1;
        required int32 id = 2;
        optional string email = 3;
        enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }
    message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = HOME];
    }
    repeated PhoneNumber phone = 4;
    }
    message AddressBook {
        repeated Person person = 1;
    }
3.编译描述(注意addressbook.proto保存时使用ANSI格式)

    cmd>protoc --java_out=d:\protobuf\out addressbook.proto

    -- 会生成源代码.

4.获得生成的源代码
    略
5.导入对象到工程
    a.引入google protobuf类库
    b.复制源代码到eclise中.

6.实例化对象
    package com.example.tutorial;

    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;

    import com.example.tutorial.AddressBookProtos.Person;
    import com.example.tutorial.AddressBookProtos.Person.PhoneNumber;
    import com.example.tutorial.AddressBookProtos.Person.PhoneType;

    public class TestPB {

        public static void main(String[] args) throws Exception {
            //使用对象
            PhoneNumber number = Person.PhoneNumber.newBuilder()
                            .setType(PhoneType.MOBILE)
                            .setNumber("123456")
                            .build();

            Person p = Person.newBuilder().setId(100)
                .setName("tom")
                .setEmail("[email protected]")
                .addPhone(number)
                .build();

            //使用PB串行化对象
            FileOutputStream fos = new FileOutputStream("d:/protobuf/person.dat");
            p.writeTo(fos);
            fos.close();
            System.out.println("over");

        }
    }

串行化技术对比

[Space Size]
java-build-in( 870) > google-protobuf(230) > avro(210)      //3倍多

[Time]
java-build-in(75.3) > avro(12.3) > google-protobuf(6.6)     //10倍多
    @Test
    public void testProtoBuf() throws Exception {
        // 使用对象
        PhoneNumber number = Person.PhoneNumber.newBuilder().setType(PhoneType.MOBILE).setNumber("123456789").build();
        Person p = Person.newBuilder().setId(100).setName("tom").setEmail("[email protected]").build();
        // 使用PB串行化对象
        long start = System.nanoTime();
        FileOutputStream fos = new FileOutputStream("d:/protobuf/person.dat");
        p.writeTo(fos);
        System.out.println(System.nanoTime() - start);
        fos.close();
        System.out.println("over");
        // 使用java串行化计算
        fos = new FileOutputStream("d:/protobuf/person_java.dat");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        start = System.nanoTime();
        oos.writeObject(p);
        System.out.println(System.nanoTime() - start);
        System.out.println("over1");
        oos.close();
        fos.close();
    }

 



以上是关于MappedByteBuffer protobuf的主要内容,如果未能解决你的问题,请参考以下文章

MappedByteBuffer - BufferOverflowException

MappedByteBuffer - 页面到物理内存的映射

使用 java.nio.MappedByteBuffer 时防止 OutOfMemory

MappedByteBuffer protobuf

使用 MappedByteBuffer 时出现 IndexOutOfBoundsException

无法使用 MappedByteBuffer 读取块中的文件