package cn.tedu.pojo;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
public class AVRODemo {
@Test
public void createUser() {
User u1 = new User();
u1.setUsername("Helen");
u1.setAge(19);
u1.setGender("male");
System.out.println(u1);
User u2 = new User("Lucy", 18, "male");
System.out.println(u2);
// 建造者模式
User u3 = User.newBuilder(u2).setUsername("Lily").build();
System.out.println(u3);
}
// 序列化
@Test
public void serial() throws IOException {
User u1 = new User("Amy", 15, "female");
User u2 = new User("Sam", 16, "male");
User u3 = new User("Bob", 17, "male");
// 获取序列化流
DatumWriter<User> dw = new SpecificDatumWriter<>(User.class);
// 获取文件流
DataFileWriter<User> dfw = new DataFileWriter<>(dw);
// 指定写出的文件
dfw.create(User.SCHEMA$, new File("D:\\a.txt"));
// 写出对象
dfw.append(u1);
dfw.append(u2);
dfw.append(u3);
// 关流
dfw.close();
}
// 反序列化
@Test
public void deserial() throws IOException {
// 获取反序列化流
DatumReader<User> dr = new SpecificDatumReader<>(User.class);
// 获取文件流
DataFileReader<User> dfr = new DataFileReader<>(
new File("D:\\a.txt"), dr);
// AVRO将这个文件流设计成了一个迭代器模式
// 所以可以利用迭代器模式来遍历对象
while (dfr.hasNext()) {
User u = dfr.next();
System.out.println(u);
}
// 关流
dfr.close();
}
}
测试输出:
{"username": "Amy", "age": 15, "gender": "female"}
{"username": "Sam", "age": 16, "gender": "male"}
{"username": "Bob", "age": 17, "gender": "male"}
图: