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(); } }
1.protocal buffer,协议缓冲区. 2.串行化技术。 java.io.Serializable ObjectOutputStream / ObjectInputStream transient //临时的 transaction //事务 truncate //截断.
[java串行化] 易于使用 效率不高。 没有语言的互操做性。 [手动二进制编码] 效率高 难 跨语言 [人性化文档结构] xml/json/txt/sax 低效 [PB] 描述语言 编译器 库 2008年发布.
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("abc@hotmail.com") .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("bei@163.com").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(); }