首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 基礎數據類型與流操作:DataInput/OutputStream 實戰指南

     編輯:Java 程式設計入門

概述

Java 提供 DataInputStream / DataOutputStream 專門處理基本數據類型(byte、short、int、long、float、double、boolean、char)與 String(UTF-8 編碼)的二進制序列化。它們實現了 DataInput/DataOutput 接口,RandomAccessFile 同樣實現這兩個接口,支持隨機讀寫。

核心 API 速查

數據類型寫入方法讀取方法
bytewriteByte()readByte()
shortwriteShort()readShort()
intwriteInt()readInt()
longwriteLong()readLong()
floatwriteFloat()readFloat()
doublewriteDouble()readDouble()
booleanwriteBoolean()readBoolean()
charwriteChar()readChar()
String (UTF-8)writeUTF()readUTF()

自定義序列化實戰:Account 對象

場景:J2ME/嵌入式/網絡傳輸需輕量級序列化,不依賴 JDK 序列化機制。

1. 定義領域模型

public class Account {
    private String userName = "";
    private String email = "";
    private int age = 0;
    private boolean gender = false; // true=male, false=female

    public Account() {} // 必須有無參構造器

    public Account(String userName, String email, int age, boolean gender) {
        this.userName = userName;
        this.email = email;
        this.age = age;
        this.gender = gender;
    }

    // 序列化:按固定順序寫入
    public void serialize(DataOutputStream dos) throws IOException {
        dos.writeUTF(userName);
        dos.writeUTF(email);
        dos.writeInt(age);
        dos.writeBoolean(gender);
    }

    // 反序列化:嚴格按相同順序讀取
    public static Account deserialize(DataInputStream dis) throws IOException {
        Account account = new Account();
        account.userName = dis.readUTF();
        account.email = dis.readUTF();
        account.age = dis.readInt();
        account.gender = dis.readBoolean();
        return account;
    }

    @Override
    public String toString() {
        return "UserName=" + userName + ", Email=" + email + ", Age=" + age + 
               ", Gender=" + (gender ? "Male" : "Female");
    }
}

2. 測試驗證

public class TestDataIO {
    public static void main(String[] args) throws IOException {
        Account original = new Account("mingjava", "eric.zhan@263.net", 25, true);
        System.out.println("Before: " + original);

        // 內存流演示
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        original.serialize(dos);
        dos.flush();

        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()));
        Account restored = Account.deserialize(dis);
        System.out.println("After:  " + restored);

        dos.close();
        dis.close();
    }
}

進階應用場景

  • 網絡通訊協議:客戶端/服務端約定二進制報文結構,用 Data流 高效編解碼。
  • 文件存儲:配合 RandomAccessFile 實現定長記錄隨機訪問(如簡易索引)。
  • 跨語言交互:二進制格式無語言綁定,C/C++/Python 易於解析。

注意事項

  1. 順序嚴格一致:寫入/讀取順序必須完全一致,否則數據錯位。
  2. 字節序:Data流 使用 Big-Endian(網絡字節序),跨平台安全。
  3. UTF-8 限制:writeUTF 修改版 UTF-8,字符串長度限 65535 字節,超長需自定義編碼。
  4. 異常處理:讀取時需捕獲 EOFException、UTFDataFormatException。

總結

DataInput/OutputStream 是 Java 處理二進制基本類型的利器,適合高性能、低開銷的序列化場景。掌握其 API 與自定義序列化模式,能應對嵌入式、網絡協議、舊系統集成等多種實戰需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved