前言:二进制序列化的基石为什么需要DataOutput接口?在讨论跨平台数据交换时,我们常常面临一个根本性问题:如何将内存中的Java基本数据类型转换为平台无关的字节序列? DataOutput接口正是为解决这一问题而生,它提供了标准化的二进制序列化契约,让开发者无需关心底层字节操作的复杂细节。 本文的独特价值市面上关于DataOutput接口的深度分析极其稀少,大多将其视为简单的工具接口。 与DataInput形成了完美的对称关系:展开代码语言:TXTAI代码解释//写入dataOutput.writeInt(12345);dataOutput.writeUTF("HelloWorld") (极致性能)外部API:JSON(人类可读,广泛支持)持久化存储:ProtocolBuffers(模式演化,空间效率)临时缓存:DataOutput(简单快速)结语:标准化契约的永恒智慧DataOutput
setSumFlow(long sumFlow) { this.sumFlow = sumFlow; } // 序列化 public void write(DataOutput dataOutput) throws IOException { dataOutput.writeLong(upFlow); dataOutput.writeLong( downFlow); dataOutput.writeLong(sumFlow); } // 反序列 跟序列化顺序一致 public void readFields dataOutput) throws IOException { dataOutput.writeLong(upFlow); dataOutput.writeLong( downFlow); dataOutput.writeLong(sumFlow); } // 反序列 跟序列化顺序一致 public void readFields
avCaptureSession.canAddInput(deviceInput) 42 { 43 avCaptureSession.addInput(deviceInput) 44 } 45 46 let dataOutput = AVCaptureVideoDataOutput() 47 dataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as AnyHashable : Int(kCVPixelFormatType_32BGRA)] 48 dataOutput.alwaysDiscardsLateVideoFrames = true 49 if avCaptureSession.canAddOutput (dataOutput) 50 { 51 avCaptureSession.addOutput(dataOutput) 52 } 53 54 let queue = DispatchQueue (label:“VideoQueue”, attributes:.concurrent) 55 dataOutput.setSampleBufferDelegate(self, queue: queue
dataOutput) throws IOException { dataOutput.writeUTF(name); dataOutput.writeUTF(phone ); dataOutput.writeUTF(addr); dataOutput.writeLong(flow); } @Override public dataOutput) throws IOException { dataOutput.writeUTF(name); dataOutput.writeInt(math ); dataOutput.writeInt(chinese); dataOutput.writeInt(english); } @Override dataOutput) throws IOException { dataOutput.writeUTF(this.name); dataOutput.writeInt
,并根据所有 Java 基本类型数据进行重构 ObjectInput DataInput 包括基本类型的输入方法 扩展了DataInput接口,以包含对象、数组和 String DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流 ObjectOutput DataOutput 包括基本类型的输出方法; 扩展了DataOutput 从上面的类层次结构以及其他辅助类的说明上可以看得出来ObjectStreamConstants 约定了所有序列化时用到的常量信息DataInput以及ObjectInput 都是接口,约定了从二进制读取基本类型 对象 数组 String的方法DataOutput DataOutputStream的超集(功能上的超集,不是父类) DataXXX只能处理基本类型,ObjectXXX可以处理 基本类型以及对象 数组 String DataInput/ObjectInput DataOutput 各种方法的定义 ObjectInputStream 和 ObjectOutputStream 遵循了IO InputStream 和 OutputStream的约定,提供IO的读写方式 并且遵守了DataOutput
1.1 Writable接口源码 package org.apache.hadoop.io; import java.io.DataOutput; import java.io.DataInput; * */ void write(DataOutput out) throws IOException; /** * Deserialize the fields of Some data private int counter; private long timestamp; public void write(DataOutput / Some data private int counter; private long timestamp; public void write(DataOutput package org.apache.hadoop.io; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException
FilterOutputStream 都是Decorator 抽象的装饰器角色(并不是抽象类)他们内部都包含了各自需要增强的抽象构建 DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构 DataOutput OutputStream,没有功能增强flush也是如此,没有增强 不过DataOutputStream 内部有一个计数器,用于记录已经读取的个数 incCount方法用于计数 其余来自DataOutput DataInputStream和DataOutputStream 借助于装饰器模式,继承自他们的FilterXXXoutStream 对InputStream进行功能增强 所有增强出来的功能,来自于DataInput以及DataOutput 这两个接口是用于约定 从二进制字节中读取数据 以及将基本类型数据写入到二进制字节的两个接口 其实如果说要不是别的地方也还是需要DataInput以及DataOutput中的约定的话 这一切完全都可以去掉这两个接口 ,直接提供readXXX 或者writeXXX方法即可 所以千万不要被DataInput以及DataOutput 迷惑 两条主线:装饰器模式功能增强增强的功能来自DataXXXput接口
org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput getVip() { return vip; } public void setVip(int vip) { this.vip = vip; } public void write(DataOutput dataOutput) throws IOException{ dataOutput.writeUTF(id); dataOutput.writeInt(money); dataOutput.writeInt
出现的数据类型,实现Writable接口即可 2.对于有可能作为“键”出现的数据类型,需要实现WritableComparable接口 ##实现Writable接口: /* DataInput and DataOutput 类是java.io的类 */ public interface Writable { void readFields(DataInput in); void write(DataOutput in.readFloat(); y = in.readFloat(); z = in.readFloat(); } public void write(DataOutput interface WritableComparable<T> { public void readFields(DataInput in); public void write(DataOutput in.readFloat(); y = in.readFloat(); z = in.readFloat(); } public void write(DataOutput
(2)然后是类型在序列化的时候写入后读取值不正确,一定要统一类型中write(DataOutput out)和readFields(DataInput in)中写入和读取参数的方法,例如一个int类型如果你在 (3)Writable中用于写出的DataOutput类型没有针对String类型的序列化方法,需要先将String类型转换成为Byte数组类型,然后在进行序列化。 下面是HttpContent的类型的源码,重点是write(DataOutput out)和readFields(DataInput in)方法: package bbs.http; import java.io.DataInput ; import java.io.DataOutput; import java.io.IOException; import java.io.UnsupportedEncodingException; encodeBytes,"GBK"); // System.out.println("encoding="+this.encoding); } @Override public void write(DataOutput
public boolean filterRow() { return filterRow; } @Override public void write(DataOutput dataOutput) throws IOException { Bytes.writeByteArray(dataOutput, this.value); } @Override
dataOutput) throws IOException { dataOutput.writeInt(this.id); dataOutput.writeUTF(this.telephone dataOutput) throws IOException { dataOutput.writeInt(this.id); dataOutput.writeInt(this.year ); dataOutput.writeInt(this.month); dataOutput.writeInt(this.day); } @Override dataOutput) throws IOException { this.contactDimension.write(dataOutput); this.dateDimension.write dataOutput) throws IOException { dataOutput.writeInt(callSum); dataOutput.writeInt(callDurationSum
return index; } } } 3、序列化类 package com.gxwz.entity; import java.io.DataInput; import java.io.DataOutput public String toString() { return accountName + "\t" + orderAmount; } @Override public void write(DataOutput
代码如下: import sqlite3 class DataOutput(object): def __init__(self): self.cx=sqlite3.connect import HtmlDownloader import HtmlParser import DataOutput import time class Spider(object): def _ self.downloader=HtmlDownloader.HtmlDownloader() self.parser=HtmlParser.HtmlParser() self.output=DataOutput.DataOutput
com.shockang.study.bigdata.mapreduce; import org.apache.hadoop.io.WritableComparable; import java.io.DataInput; import java.io.DataOutput ; } else { return this.age - o.age; } } public void write(DataOutput dataOutput) throws IOException { //序列化,将NewKey转化成使用流传输的二进制 dataOutput.writeUTF( name); dataOutput.writeInt(age); dataOutput.writeInt(salary); } public void
addNum02; this.resNum = addNum01 + addNum02; } // 序列化 @Override public void write(DataOutput dataOutput) throws IOException { dataOutput.writeLong(addNum01); dataOutput.writeLong (addNum02); dataOutput.writeLong(resNum); } // 反序列化 @Override public void readFields
com.jmy.profitcase; import org.apache.hadoop.io.WritableComparable; import java.io.DataInput; import java.io.DataOutput { return o.getCountCome() - this.getCountCome(); } @Override public void write(DataOutput dataOutput) throws IOException { dataOutput.writeInt(month); dataOutput.writeUTF(name ); dataOutput.writeInt(inCome); dataOutput.writeInt(outCome); dataOutput.writeInt
package com; import org.apache.hadoop.io.WritableComparable; import java.io.DataInput; import java.io.DataOutput public void setAmount(Double amount) { this.amount = amount; } public void write(DataOutput
Spider.py import HtmlDownloader import HtmlParser import DataOutput import UrlManager import re from self.downloader=HtmlDownloader.HtmlDownloader() self.parser=HtmlParser.HtmlParser() self.output=DataOutput.DataOutput driver.page_source def download(self,driver,url): driver.get(url) return driver.page_source DataOutput.py import sqlite3 class DataOutput(object): def __init__(self): self.cx=sqlite3.connect("cnblog.db
import lombok.Data; import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput String phone; private long up; private long down; private long sum; public void write(DataOutput dataOutput) throws IOException { dataOutput.writeUTF(phone); //字符串 dataOutput.writeLong (up); //Long dataOutput.writeLong(down); dataOutput.writeLong(sum); } public