Java 日看一类(12)DataOutput接口与DataOutputStream类

51、Java I/O 常用类与接口详解 本文详细介绍了Java I/O包中的常用类与接口,包括CharArrayWriter、CharArrayReader、DataInputStream、DataOutputStream、File类、FileInputStream、FileOutputStream、RandomAccessFile、BufferedReader、BufferedWriter、PrintStream和PrintWriter等。通过示例代码讲解了这些类和接口的基本用法以及在实际开发中的应用场景,帮助开发者高效地进行文件和流操作。 阅读详情

DataOutput接口与前面讲过的DataInput接口相对应,功能基本相反




注释:

/**
 * The <code>DataOutput</code> interface provides
 * for converting data from any of the Java
 * primitive types to a series of bytes and
 * writing these bytes to a binary stream.
 * There is  also a facility for converting
 * a <code>String</code> into
 * <a href="DataInput.html#modified-utf-8">modified UTF-8</a>
 * format and writing the resulting series
 * of bytes.
 * <p>
 * For all the methods in this interface that
 * write bytes, it is generally true that if
 * a byte cannot be written for any reason,
 * an <code>IOException</code> is thrown.
 *
 * @author  Frank Yellin
 * @see     java.io.DataInput
 * @see     java.io.DataOutputStream
 * @since   JDK1.0
 */

大意如下:

该接口用于将数据从Java基本类型转化为二进制byte流,同时提供了一个将字符串转化为修改版UTF-8并写入所得到的修改版UTF-8字节的工具

对于该接口中的任意方法,如果由于某个原因无法写入某个字节,将抛出IOExpection




该接口中定义了十四个方法:





以上就是该接口所定义的全部方法及其作用(该内容来自官方文档),从中我们可以明显感觉到DataOutput接口与DataInput接口在功能上十分类似,除了数据的流动方向不同外,其他功能基本一样。其实在IO包中,各种相对应的输入输出流基本都是如此,因为其本身就是被设计从相对的输出流来接受数据或向相对的输入流输出数据。





DataOutputStream是DataOutput接口的完整实例

该类继承自FilterOutputStream



该类的作用注释如下

/**
 * A data output stream lets an application write primitive Java data
 * types to an output stream in a portable way. An application can
 * then use a data input stream to read the data back in.
 *
 * @author  unascribed
 * @see     java.io.DataInputStream
 * @since   JDK1.0
 */

大意为:

一个通过便携方法让应用程序写出Java基本类型数据的数据输出流

一个应用程序在稍后可以使用数据输入流来读取刚写出的数据




该类含有两个成员变量

当目前为止已写入输出流的字节数

protected int written;

byte缓冲区(用于writeUTF方法)

private byte[] bytearr = null;


该类含有十五个方法(多一个构造方法)

构造方法

public DataOutputStream(OutputStream out) {
    super(out);
}

修改写入记数

private void incCount(int value) {//value这次写入的字节数
    int temp = written + value;
    if (temp < 0) {//溢出判定
        temp = Integer.MAX_VALUE;
    }
    written = temp;
}

写出单个int值的低八位

public synchronized void write(int b) throws IOException {
    out.write(b);
    incCount(1);//增加一次写入记数
}

将数组中特定位置及长度的数据依次写出

public synchronized void write(byte b[], int off, int len)
    throws IOException
{
    out.write(b, off, len);
    incCount(len);
}

刷新流

public void flush() throws IOException {
    out.flush();
}

写出boolean值(其实默认int值)

public final void writeBoolean(boolean v) throws IOException {
    out.write(v ? 1 : 0);
    incCount(1);
}

写出低八位(在该类中和write(int)没啥区别)

public final void writeByte(int v) throws IOException {
    out.write(v);
    incCount(1);
}

写出两个字节(把short值拆分)

public final void writeShort(int v) throws IOException {
    out.write((v >>> 8) & 0xFF);//低位
    out.write((v >>> 0) & 0xFF);
    incCount(2);
}

写出两个字节(拆分char值)

public final void writeChar(int v) throws IOException {
    out.write((v >>> 8) & 0xFF);
    out.write((v >>> 0) & 0xFF);
    incCount(2);
}

写出四个字节(拆分int值)

public final void writeInt(int v) throws IOException {
    out.write((v >>> 24) & 0xFF);
    out.write((v >>> 16) & 0xFF);
    out.write((v >>>  8) & 0xFF);
    out.write((v >>>  0) & 0xFF);
    incCount(4);
}

写出八个字节(拆分long值)

public final void writeLong(long v) throws IOException {
    writeBuffer[0] = (byte)(v >>> 56);
    writeBuffer[1] = (byte)(v >>> 48);
    writeBuffer[2] = (byte)(v >>> 40);
    writeBuffer[3] = (byte)(v >>> 32);
    writeBuffer[4] = (byte)(v >>> 24);
    writeBuffer[5] = (byte)(v >>> 16);
    writeBuffer[6] = (byte)(v >>>  8);
    writeBuffer[7] = (byte)(v >>>  0);
    out.write(writeBuffer, 0, 8);
    incCount(8);
}

写出四个字节(拆分float值)

public final void writeFloat(float v) throws IOException {
    writeInt(Float.floatToIntBits(v));//进行格式转化
}

写出八个字节(拆分double值)

public final void writeDouble(double v) throws IOException {
    writeLong(Double.doubleToLongBits(v));
}

字符串按字节顺序写出

public final void writeBytes(String s) throws IOException {
    int len = s.length();
    for (int i = 0 ; i < len ; i++) {
        out.write((byte)s.charAt(i));
    }
    incCount(len);
}

字符串按字符顺序写出

public final void writeChars(String s) throws IOException {
    int len = s.length();
    for (int i = 0 ; i < len ; i++) {
        int v = s.charAt(i);
        out.write((v >>> 8) & 0xFF);
        out.write((v >>> 0) & 0xFF);
    }
    incCount(len * 2);
}

写出字符串(先写入两个字节的长度信息,然后写入字符串的修改版UTF-8形式,记数)

static int writeUTF(String str, DataOutput out) throws IOException {
    int strlen = str.length();
    int utflen = 0;
    int c, count = 0;

    /* use charAt instead of copying String to char array */
    for (int i = 0; i < strlen; i++) {
        c = str.charAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            utflen++;
        } else if (c > 0x07FF) {
            utflen += 3;
        } else {
            utflen += 2;
        }
    }

    if (utflen > 65535)
        throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

    byte[] bytearr = null;
    if (out instanceof DataOutputStream) {//没有绑定written,并且后文也没有对记数的修改,所以该方法写出不影响记数-——当前版本为1.8
        DataOutputStream dos = (DataOutputStream)out;
        if(dos.bytearr == null || (dos.bytearr.length < (utflen+2)))
            dos.bytearr = new byte[(utflen*2) + 2];
        bytearr = dos.bytearr;
    } else {
        bytearr = new byte[utflen+2];
    }

    bytearr[count++] = (byte) ((utflen >>> 8) & 0xFF);
    bytearr[count++] = (byte) ((utflen >>> 0) & 0xFF);

    int i=0;
    for (i=0; i<strlen; i++) {
       c = str.charAt(i);
       if (!((c >= 0x0001) && (c <= 0x007F))) break;
       bytearr[count++] = (byte) c;
    }

    for (;i < strlen; i++){
        c = str.charAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            bytearr[count++] = (byte) c;

        } else if (c > 0x07FF) {
            bytearr[count++] = (byte) (0xE0 | ((c >> 12) & 0x0F));
            bytearr[count++] = (byte) (0x80 | ((c >>  6) & 0x3F));
            bytearr[count++] = (byte) (0x80 | ((c >>  0) & 0x3F));
        } else {
            bytearr[count++] = (byte) (0xC0 | ((c >>  6) & 0x1F));
            bytearr[count++] = (byte) (0x80 | ((c >>  0) & 0x3F));
        }
    }
    out.write(bytearr, 0, utflen+2);
    return utflen + 2;//返回写入长度
}

写出字符串(调用上个方法,用自己的流写出)

public final void writeUTF(String str) throws IOException {
    writeUTF(str, this);
}

获得已写出的数据量

public final int size() {
    return written;
}




DataOutputStream是DataOutput的一个实例,将DataOutput功能的完成方式给我们直观的表现出来。但也发现一些奇怪的地方,比如writerUTF()方法写出的数据竟然不被记录,不知道是本身设计上不需要还是忘了添加尴尬






微波无源器件 功分器1 新型方波导双模无功功分器 本名证明了一种基于有着特定功能的(dedicated)T性匹配元件(散射件)的进化结点的新型波导双模两路功分器的可行性。这个散射件,有着面向三个部分的匹配部分,提供了等效功分并且朝着对应的输出端口传输矩形波导的两个TE10/TE01正交模式。所提出的设计紧凑,易于比例变化并且能够级联来获得。 阅读详情

相关推荐

基于Dify Agent构建智能客服:攻克知识库查询、多轮对话、安全鉴权与人机协同

基于Dify Agent构建智能客服,并将知识库等核心能力工具化,再通过Chatflow进行流程编排,是一种强大且灵活的策略。它不仅解决了当前AI客服面临的诸多核心挑战,也为未来的功能扩展和智能化升级打下了坚实的基础。希望本文能为您在构建高效、智能的AI客服系统之路上提供有益的参考!dify实验室基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify工作流案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。关注我,获取Dify相关资源(DSL、token、交流群等)。

同名公众号:dify实验室 3742

Java——DataOutputStream类

官方解释 public class DataOutputStream extends FilterOutputStream implements DataOutput 数据输出流使应用程序以便携式方式将原始Java数据类型写入输出流。 然后应用程序可以使用数据输入流来读取数据。 构造方法 DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流。 writeUTF public final void writeUTF(String str)

joey_ro的博客 4898

Doris副本修复实战:从状态机到手动修复的完整指南

在分布式数据库系统中,多副本机制是实现高可用与数据一致性的核心技术。其原理是通过在不同节点存储数据的多个拷贝,确保部分节点故障时服务仍可继续。这项技术的核心价值在于保障数据可靠性,并支撑在线分析处理(OLAP)等对数据一致性要求高的应用场景。当副本出现损坏、丢失或版本不一致时,系统通常依赖自动修复机制,但在元数据损坏、多副本同时故障等复杂场景下,自动修复可能失效,需要深入理解副本状态机并借助手动工具介入。本文将聚焦Doris数据库,解析Tablet副本状态流转(如BAD、VERSION_ERROR),并详细

weixin_32288959的博客 468

Java IO流--数据流DataInputStream和DataOutputStream的使用

数据流: DataInputStream 和 DataOutputStream 作用:用于读取或者写出基本数据类型或者字符串 @Test public void test2(){ DataOutputStream dos = null; try { dos = new DataOutputStream(new FileOutputStream("demo.txt")); dos.writeUTF("程序员");

路宇的博客 2185

【亲测】ubuntu20.4 安装CUDA11.8

一步一步搭建C++ CUDA CUDNN TENSORRT OPENCV DNN ONNXRUNTIME推理环境

weixin_40950590的博客 3897

高效爬取懂车帝车型数据:从静态解析到动态反爬实战

本文详细解析了如何高效爬取懂车帝车型数据,从静态HTML解析到动态接口反爬的完整实战路径。文章重点介绍了使用浏览器开发者工具定位数据、应对CSS混淆与参数加密等反爬策略,并提供了整合静态与动态抓取逻辑的Python代码示例,帮助开发者稳健地获取结构化车型信息。

wind6的博客 937

Java中DataOutputStream和DataInputStream的使用

import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /*数据专属流,将数据联通数据的类型一并写入文件*/ public class DataOutputStreamTest { public static void main(String[] args) { DataOu.

weixin_51351637的博客 7246

NACA0012的O型网格求解

本篇文章采用偏微分方程数值解法生成NACA0012翼型O型网格,并采用速度势方程求解绕NACA0012翼型迎角为0度时的低速不可压无粘流场。 文章目录一、求解网格1.翼型2.远场3.网格4.迭代5.求解二、求解流场1.偏微分方程2.迭代求解流场三、求解参数1.偏微分方程2.迭代求解四、导出数据 一、求解网格 1.翼型 本次求解网格和流场等采用的是NACA0012(修形)对称翼型,在NACA四位翼型中,第一位数字代表的是弯度,第二位数字代表的是弯度位置,后两位数字代表的是厚度,由于本次翼型的前两位数字都为0,

m0_50746433的博客 6677

Java基础知识之DataInputStream/DataOutputStream

DataOutputStream的代码块: import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /* java.io.DataOutputStream:数据专属的流。 这个流可以将数据连同数据的类型一并写入文件。 注意:这个文件不是普通文本文档。(这个文件使用记事本打不开。) */ publi

JCDYN1219的博客 1799

【数据挖掘】遗传算法原理浅析:什么是遗传算法?遗传算法的工作原理是什么?

遗传算法(Genetic Algorithm,GA),是进化算法的框架和核心。 各种进化算法有什么异同? - 及时物语的回答 - 知乎 https://www.zhihu.com/question/39152390/answer/901070749

纸羊同学的博客 4286

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 174

Java自学日记之IO流(五):数据流(DataInputStream、DataOutputStream)

系列文章目录 Java自学日记之IO流(一):字节流和字符流 Java自学日记之IO流(二):转换流(InputStreamReader、OutputStreamWriter) Java自学日记之IO流(三):缓冲流(BufferedInputStream、BufferedOutputStream) Java自学日记之IO流(四):字节数组流(ByteArrayInputStream、ByteArrayOutputStream) 文章目录系列文章目录前言一、数据流介绍二、构造方法1.DataInputSt

qq_51738873的博客 4531

GEE案例:计算区域生态总体脆弱性分析

计算区域生态总体脆弱性分析需要考虑多个指标和因素。下面是一个基本的方法:选择指标:选择一组能够反映区域生态系统脆弱性的指标。这些指标可以包括生物多样性指数、森林覆盖率、湿地保护率、土地退化程度等。为每个指标分配权重:为了使得各指标在计算中的重要性相对均衡,可以为每个指标分配一个权重。权重可以根据各指标的重要性和可利用的数据进行确定。数据收集和处理:收集每个指标的数据,并对其进行处理,确保数据的准确性和一致性。如果有需要,可以对数据进行归一化处理。计算指标值:根据收集的数据和权重,计算每个指标的值。

此星光明博客 466

01 DataOutput 接口

一:DataOutput 接口 1.接口的简介   DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流(OutputStream)。同时还提供了一个将 String 转换成 UTF-8修改版格式并写入所得到的系列字节的工具。   对于此接口中写入字节的所有方法,如果由于某种原因无法写入某个字节,则抛出 IOException。

兀兀穷年 1428

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

接口 DataOutput

java.io 接口 DataOutput 所有已知子接口: ImageOutputStream, ObjectOutput 所有已知实现类: DataOutputStream, FileCacheImageOutputStream, FileImageOutputStream, ImageOutputStreamImpl, MemoryCacheIm...

angji2879的博客 156

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java文件data_java流与文件——读写二进制数据(DataOutput + DataInput)

【0】README0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——读写二进制数据(DataOutput + DataInput)的相关知识;【1】DataOutput1.0)DataOutput 接口定义 了 下面用于以二进制格式写数组, 字符, boolean 和 字符串的方法:writeChars, writeByte, writeInt, wri...

weixin_42471823的博客 755

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java IO操作——数据操作流DataOutputStream和DataInputStream的使用

学习目标  掌握DataOutputStream和DataInputStream的作用 可以使用DataOutputStream和DataInputStream写入和读入数据 数据操作流 在io包中,提供了两个与平台无关的数据操作流: 数据输出流(DataOutputStream) 数据输入流 (DataInputStream) 通常数据输出流会按照一定的格式将数据输出,再通过数据输

2万+

Java DataOutputStream writeChars()方法及示例

DataOutputStream类writeChars()方法 (DataOutputStream Class writeChars() method) writeChars() method is available in java.io package. writeChars()方法在java.io包中可用。 writeChars() method is used to write the ...

cumtb2002的博客 752

Java DataOutputStream writeLong()方法与示例

DataOutputStream类writeLong()方法 (DataOutputStream Class writeLong() method) writeLong() method is available in java.io package. writeLong()方法在java.io包中可用。 writeLong() method is used to write the given...

cumtv80668的专栏 762

java流与文件——读写二进制数据(DataOutput + DataInput)

【0】README0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——读写二进制数据(DataOutput + DataInput)的相关知识; 0.2) for complete my diy code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/

PacosonSWJTU的博客 1万+

DataOutputStream和DataInputStream之读写操作

DataOutputStream和DataInputStreamDataOutputStreamDataInputStream 掌握DataOutputStream和DataInputStream的作用。 可以使用DataOutputStream和DataInputStream写入和读取数据。 在IO包中提供了两个与平台无关的数据操作流 数据输出流:DataOutputStream 数据输入流:D...

shyming's blog 1647

“黑马程序员”IO流 DataInputStream与DataOutputStream的用法

DataInputStream是数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。 DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。 DataOutputStream是OutputStream的子类,此类的定义如下: public class

专注的专栏 1093

Java之IO(四)DataInputStream和DataOutputStream

  转载请注明源出处:http://www.cnblogs.com/lighten/p/6986155.html 1.前言   DataInputStream和DataOutputStream分别继承了FilterInputStream和FilterOutputStream,这块内容在第二节介绍BufferedInputStream和BufferedOutputStream的时候介绍...

decvo6179的博客 660

DataOutputStream 源码分析

转自:http://www.fengfly.com/plus/view-214065-1.html DataOutputStream 是数据输出流。它继承于FilterOutputStream。 DataOutputStream 是用来装饰其它输出流,将DataOutputStream和DataInputStream输入流配合使用,“允许应用程序以与机器无关方式从底层输入流中读写基本 Ja

asivy的专栏 821

[十一]JavaIO之DataInputStream 和 DataOutputStream

  功能简介   DataInputStream和DataOutputStream 继承了各自的FilterInputStream以及FilterOutputStream 使用装饰器模式对InputStream和OutputStream进行功能增强   FilterInputStream以及FilterOutputStream 都是Decorator 抽象的装饰器角色(并不是抽象类) ...

noteless的博客 412

Java中基本数据类型与流的操作方法

  Java中除了二进制文件和使用文本文件外还有基于Data的数据操作,这里的Data指的是Java的基本数据类型和String。基本数据类型包括byte、int、char、long、float、double、boolean和short。  说到Java的基本数据类型必须谈到的两个类是DataInputStream和DataOutputStream。它们提供了对Java基本数据类型的操作,但是这些

键者天行 5981
上一篇: Java 日看一类(11)之IO包中的DataInputStream类
下一篇: Java 日看一类(13)之IO包中的DefaultFileSystem类和DeleteOnExitHook类
wyf95278
博客等级 码龄10年 38粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值