byte数组和int,char,String的关系以IO例

先举两个例子
文件是自己随便写的一个文件,可以自己设置一下,内容包括中英文和数字

首先要明确一点,InputStream读取数据的格式为二进制数据
在这里用 temp=input.read() 读取,那么int格式的temp实际上内容为二进制数据
但是,int可以表示二进制数据所以不冲突,还有一点:
为什么InputStream.read()读取一个byte却返回一个int?
InputStream.read()实际上返回一个unsigned byte[0~255],而java中无此类型,只能用int接收(byte[-128~127]),而且read()返回值中还有对“-1”的要求,更不能实用byte来接收了,所以实用int接收数据。

再有byte数组和String分别代表不同的数据,专门服务于不同的目的
String在java是字符数组,他的字符是实用Unicode字符来构建的
String s=new String(byteArray)
把数组byteArray[] 的值初始化给了s,所以s是一个把byte类型的数据转化为Unicode字符数组的字符串
这样就可以理解二进制数据转换为汉字的原因

关于char

import java.io.*;
public class T1 {
    public static void main (String[] args) throws Exception {
        File file=new File("E:"+File.separator+"垃圾文件.txt");
        InputStream input=new FileInputStream(file);
        int temp;

        while((temp=input.read())!=-1){
            System.out.print((char)temp);
        }

        input.close();
        System.out.println("读取结束!");
    }
}
import java.io.*;
public class T2 {
    public static void main (String[] args) throws Exception {
        File file=new File("E:"+File.separator+"垃圾文件.txt");
        InputStream input=new FileInputStream(file);
        byte data[]=new byte[10];
        int foot=0;
        int temp=0;
        while((temp=input.read())!=-1){
            data[foot++]=(byte)temp;
        }

        input.close();
        System.out.println(new String(data,0,foot));
    }
}
<think>我们参考了引用[2]引用[3]中的内容,它们都提到了使用ByteArrayInputStream类来实现将字节数组转换为InputStream。 具体步骤: 1. 导入java.io.ByteArrayInputStreamjava.io.InputStream。 2. 创建一个ByteArrayInputStream对象,将字节数组作为构造函数的参数传入。 3. 这样,ByteArrayInputStream对象就可以当作InputStream使用。 示代码: 假设我们有一个字节数组 `byte[] data = ...;`,那么转换代码如下: InputStream inputStream = new ByteArrayInputStream(data); 注意:ByteArrayInputStream是InputStream的子类,因此可以直接传递给任何需要InputStream的方法。 同时,引用[3]也提到,如果可能的话,尽量直接使用InputStream(而不是先转成字节数组再转回),以避免不必要的内存占用。但在某些情况下(如处理旧代码)可能需要这样的转换。 因此,方法如下: </think>在 Java 中,将字节数组转换为 `InputStream` 是一个常见操作,可以通过 `ByteArrayInputStream` 类轻松实现。以下是详细步骤代码: ### 转换方法 1. **导入必要类**: ```java import java.io.ByteArrayInputStream; import java.io.InputStream; ``` 2. **创建 `ByteArrayInputStream` 对象**: ```java byte[] byteArray = ...; // 您的字节数组 InputStream inputStream = new ByteArrayInputStream(byteArray); ``` ### 完整示 ```java import java.io.ByteArrayInputStream; import java.io.InputStream; public class ByteArrayToInputStream { public static void main(String[] args) { // 示字节数组 byte[] data = {72, 101, 108, 108, 111}; // "Hello" 的 ASCII 码 // 转换为 InputStream InputStream inputStream = new ByteArrayInputStream(data); // 使用示:逐字节读取 try { int byteRead; while ((byteRead = inputStream.read()) != -1) { System.out.print((char) byteRead); // 输出: Hello } } catch (Exception e) { e.printStackTrace(); } } } ``` ### 关键说明 1. **`ByteArrayInputStream` 特性**: - 继承自 `InputStream`,可直接传递给任何需要 `InputStream` 参数的方法 - 使用字节数组作为数据源,无需额外缓冲区 - 线程安全(多个线程读取同一实需自行同步) 2. **注意事项**: ```java // 避免在循环中重复创建(应复用 InputStream) InputStream stream = new ByteArrayInputStream(data); // ✅ 推荐 // 不需要手动关闭(无系统资源占用) ``` 3. **适用场景**: - 内存数据处理(如 XML/JSON 解析) - 单元测试中模拟输入流 - 旧代码改造(当 API 强制要求 `InputStream` 参数时) > **最佳实践**:若数据源本身支持 `InputStream`(如文件、网络),应优先直接使用而非先转字节数组再转换,以减少内存占用[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值