【MappedByteBufferprotobuf】我自横刀向天笑,去留肝胆两昆仑。这篇文章主要讲述MappedByteBufferprotobuf相关的知识,希望能为你提供帮助。
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.01.设计对象
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(); }
推荐阅读
- 番茄花园Ghost windows7 专业版系统64位下载
- Be Happy.——我的ACM退役贴
- appearance设置公共属性
- Android(Layout_weight的深刻理解)
- scala的apply方法
- Android实战简易教程-第二十三枪(基于Baas的用户注冊和登录模块实现!)
- android基础知识---重写系统Crash处理类保存上传和完美退出程序的方法
- 彻底明确Android中AIDL及其使用
- 边做项目边学Android小白会遇到的问题--Appcompat_V7问题