读取文件中的单个字节(基础I/O操作)
import java.io.FileInputStream; import java.io.IOException; public class ReadSingleByte { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("example.txt")) { int byteData; // 循环读取直到文件末尾(返回-1) while ((byteData = fis.read()) != -1) { byte b = (byte) byteData; // 转换为byte类型 System.out.println("字节值(十进制): " + byteData); System.out.println("十六进制格式: 0x" + Integer.toHexString(byteData)); } } catch (IOException e) { e.printStackTrace(); } } }
关键点:
FileInputStream.read()
返回int
(0-255),文件结束返回-1
- 需处理
IOException
和资源关闭(推荐try-with-resources)
高效读取字节块(批量处理)
import java.io.BufferedInputStream; import java.io.FileInputStream; public class ReadByteBlock { public static void main(String[] args) { byte[] buffer = new byte[1024]; // 1KB缓冲区 try (BufferedInputStream bis = new BufferedInputStream( new FileInputStream("largefile.dat"))) { int bytesRead; while ((bytesRead = bis.read(buffer)) != -1) { processBytes(buffer, bytesRead); // 处理读取到的字节 } } catch (IOException e) { e.printStackTrace(); } } private static void processBytes(byte[] data, int length) { // 示例:打印前10字节的十六进制 for (int i = 0; i < Math.min(10, length); i++) { System.out.printf("%02X ", data[i]); } System.out.println(); } }
优势:
- 缓冲机制减少磁盘I/O次数
- 批量处理大幅提升性能
操作内存中的字节数据(ByteBuffer
)
import java.nio.ByteBuffer; public class ByteBufferExample { public static void main(String[] args) { // 创建缓冲区(堆内内存) ByteBuffer buffer = ByteBuffer.allocate(8); // 写入数据 buffer.put((byte) 0xCA); buffer.put((byte) 0xFE); buffer.putInt(123456); // 写入4字节整数 // 切换为读模式 buffer.flip(); // 读取字节 while (buffer.hasRemaining()) { byte b = buffer.get(); System.out.printf("0x%02X ", b); } // 输出:0xCA 0xFE 0x00 0x01 0xE2 0x40 } }
应用场景:
- 网络数据包解析
- 二进制协议编解码
- 高性能数据处理
查看对象内存占用(JOL工具)
使用Java Object Layout工具分析对象字节大小:
-
添加Maven依赖:
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.17</version> </dependency>
-
代码示例:
import org.openjdk.jol.vm.VM; public class ObjectSize { public static void main(String[] args) { // 打印JVM详细信息 System.out.println(VM.current().details()); // 查看String对象大小 String s = "Hello"; System.out.println("对象大小: " + VM.current().sizeOf(s) + " bytes"); } }
输出示例:
# 64位系统压缩指针(通常结果) String对象大小: 24 bytes
调试中查看字节(IDE技巧)
在IntelliJ/Eclipse调试器中:
- 添加变量到监视窗口(Watch)
- 对
byte[]
变量右键 → View as → Hex - 直接显示内存十六进制数据
关键注意事项
- 字节符号问题:
- Java的
byte
类型是有符号的(范围 -128~127) - 需用
& 0xFF
转换为无符号整数:int unsignedByte = byteData & 0xFF; // 得到0-255的值
- Java的
- 字符编码影响:
- 文本数据需用指定编码转换字节:
String text = new String(byteArray, StandardCharsets.UTF_8);
- 文本数据需用指定编码转换字节:
- 大端序/小端序:
- 网络传输和文件格式需注意字节序
- 使用
ByteBuffer.order(ByteOrder.BIG_ENDIAN)
设置
何时需要直接操作字节?
- 解析自定义二进制文件格式(如图片、视频)
- 实现网络协议(如TCP/UDP数据包)
- 加密解密/哈希计算
- 内存敏感型应用(嵌入式开发)
引用说明:本文代码示例遵循Oracle官方Java文档规范,内存分析基于OpenJDK的JOL工具原理,文件操作符合Java NIO最佳实践,涉及标准库的内容参考自Java SE 17 API文档。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/33281.html