byte[] arr = new byte[size]
,或直接赋值已存在的字节数据字节数组的定义方式
定义方式 | 语法示例 | 适用场景 |
---|---|---|
静态初始化 | byte[] bytes = {0x01, 0x02, 0x03}; |
已知初始值,快速定义小型数组 |
动态初始化 | byte[] bytes = new byte[10]; |
需指定长度,后续赋值 |
从字符串转换 | String str = "Hello"; byte[] bytes = str.getBytes(StandardCharsets.UTF_8); |
文本数据与二进制转换 |
通过InputStream | InputStream is = ...; byte[] buffer = new byte[1024]; is.read(buffer); |
读取文件或网络流数据 |
使用ByteBuffer | ByteBuffer buffer = ByteBuffer.allocate(10); byte[] bytes = buffer.array(); |
需要灵活操作二进制数据的场景 |
静态初始化
直接通过字面量赋值,适合明确知道数组元素的场景:
byte[] bytes = { (byte) 0xFF, (byte) 0x00, (byte) 0x7F }; // 需强制类型转换
注意:Java中超过 byte
范围(-128~127)的数值需显式转换为 byte
类型。
动态初始化
通过 new
关键字创建指定长度的数组,适合需要动态调整大小的场景:
byte[] bytes = new byte[10]; // 默认所有元素为0 bytes[0] = (byte) 0xA0; // 手动赋值
从字符串转换
利用字符编码将字符串转为字节数组:
String text = "Hello"; byte[] bytes = text.getBytes(StandardCharsets.UTF_8); // 推荐指定编码格式
常见编码:UTF-8
、GBK
、ISO-8859-1
等,需根据业务需求选择。
通过输入流读取
从文件或网络流中读取数据到字节数组:
try (FileInputStream fis = new FileInputStream("example.txt")) { byte[] buffer = new byte[1024]; // 定义缓冲区 int length = fis.read(buffer); // 实际读取的字节数 }
使用 ByteBuffer
适用于需要动态拼接或解析二进制数据的场景:
ByteBuffer buffer = ByteBuffer.allocate(10); buffer.put((byte) 0x01); buffer.put((byte) 0x02); byte[] bytes = buffer.array(); // 获取底层字节数组
字节数组的常用操作
操作类型 | 方法/工具 | 示例代码 |
---|---|---|
遍历数组 | 普通循环或增强for循环 | for (byte b : bytes) { ... } |
数组比较 | Arrays.equals(byte[] a, byte[] b) |
Arrays.equals(bytes1, bytes2); |
填充数组 | Arrays.fill(byte[] a, byte val) |
Arrays.fill(bytes, (byte) 0x00); |
转换为字符串 | new String(bytes, Charset) |
new String(bytes, StandardCharsets.UTF_8); |
转换为十六进制 | 手动遍历或 Integer.toHexString() |
String.format("%02X", b) |
遍历与修改
for (int i = 0; i < bytes.length; i++) { System.out.println("Index " + i + ": " + bytes[i]); }
数组比较
boolean isEqual = Arrays.equals(bytes1, bytes2); // 比较两个数组是否完全一致
转换为十六进制字符串
StringBuilder hex = new StringBuilder(); for (byte b : bytes) { hex.append(String.format("%02X", b)); // 格式化为两位十六进制 } System.out.println(hex.toString());
子数组提取
byte[] subArray = Arrays.copyOfRange(bytes, 2, 5); // 提取索引2到4的元素
字节数组的应用场景
场景 | 说明 |
---|---|
网络传输 | Socket通信中发送/接收二进制数据(如TCP、UDP协议) |
文件读写 | 通过 FileInputStream /FileOutputStream 操作本地文件 |
加密与哈希 | 结合 MessageDigest (如SHA-256)或加密算法(如AES)处理二进制数据 |
序列化与反序列化 | 将对象转换为字节数组传输或存储(结合 Serializable 接口) |
示例:网络传输中的字节数组
// 客户端发送数据 Socket socket = new Socket("example.com", 80); byte[] request = "GET / HTTP/1.1 ".getBytes(); socket.getOutputStream().write(request); // 服务器端接收数据 byte[] responseBuffer = new byte[1024]; int len = socket.getInputStream().read(responseBuffer); String response = new String(responseBuffer, 0, len, StandardCharsets.UTF_8);
常见问题与解决方案
FAQs
如何初始化一个固定大小的空字节数组?
答:可以使用 new byte[size]
创建指定长度的数组,所有元素默认值为 0
。
byte[] bytes = new byte[100]; // 创建长度为100的数组,所有元素为0
如何将字节数组转换为十六进制字符串?
答:遍历数组并格式化每个字节为两位十六进制:
StringBuilder hex = new StringBuilder(); for (byte b : bytes) { hex.append(String.format("%02X", b)); // 大写十六进制 } return hex.toString();
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/67416.html