Java流编程实例之三--字节数组流和字符数组流

4. 字节数组流和字符数组流

很多网上的教程在介绍FileInputStream的时候,经常写出这样的代码:


        FileInputStream fis = new FileInputStream(outputfile);
        byte[] buf = new byte[1024];
        int len = fis.read(buf);

代码中使用1024字节的byte数组来存储从文件中读入的字节,但实际工作中文件不一定会小于1024字节,因此这里需要的是一个可变长的字节数组。但是java中并不支持ArrayList,如果自己编写动态可扩展的byte数组又比较浪费时间,因此这里最合适的选择便是ByteArrayOutputStream。
ByteArrayInputStream和ByteArrayOutputStream是用来表示内存中的字节数组流。其中ByteArrayOutputStream可以用来写入变长的字节数组,这对于不知道输入内容的具体长度时非常有用,例如要将一个文件的内容或者网络上的内容读入一个字节数组时。
例子代码:读入一个未知大小的文件到内存中(假设此文件使用默认编码)

public static void byteArrayOutputStreamExam() {
    try {
        FileInputStream fis = new FileInputStream("d:\\d.txt");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int len = 0;
        while((len = fis.read(buf))!=-1){
            baos.write(buf,0,len);
        }
        baos.flush();
        byte[] result = baos.toByteArray();
        String s = new String(result);
        System.out.println(s);

        baos.close();
        fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

例子代码:将一个byte数组做为输入流ByteArrayInputStream的来源,输入到一个ByteArrayOutputStream中。有趣的是,这段byte数组实际上是一段unicode编码,代表一些中文字符,程序中最后将byte数组转换为unicode编码的字符,并打印了这些字符。

public static void byteArrayInputStreamExam() {
    byte[] buf = new byte[256];
    //赋值一段汉字的unicode编码,从4e00至4eff
    for (int i = 0x00; i < 0xff; i = i + 2) {
        buf[i] = 0x4e;
        buf[i + 1] = (byte) i;
    }
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buf);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    byte[] getbuf = new byte[128];
    int len = 0;
    try {
        while ((len = byteArrayInputStream.read(getbuf)) != -1) {
            byteArrayOutputStream.write(getbuf, 0, len);
        }
        byte[] result = byteArrayOutputStream.toByteArray();
        //将得到的字节转换为unicode编码的字符串
        String s = new String(result, "unicode");
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

运行输出为:

一丂丄丆丈上丌与丐丒且世丘业东丞丠丢两並丨个丬丮丰串临丶丸为丼举乀乂乄乆么乊乌乎乐乒乔乖乘乚乜乞习乢乤书乨乪乬乮买乲乴乶乸乺乼乾亀亂亄了予亊二于亐互五亖亘亚亜亞亠亢交亦亨亪京亮亰亲亴亶亸人亼亾什仂仄仆仈今仌从仐仒仔他付仚仜仞仠仢令仦仨仪们仮仰仲仴件仸仺仼仾

ByteArrayInputStream和ByteArrayOutputStream是字节数组流,那么与之对应的字符数组流则是StringReader和StringWriter(早期java使用StringBufferInputStream和StringBufferOutputStream,这两个类在jdk1.1后被废弃),也给出一个例子:

public static void stringReaderExam() {
    String str = "This is a good day.今天是个好天气。";
    StringReader stringReader = new StringReader(str);
    StringWriter stringWriter = new StringWriter();
    char[] buf = new char[128];
    int len = 0;
    try {
        while ((len = stringReader.read(buf)) != -1) {
            stringWriter.write(buf, 0, len);
        }
        stringWriter.flush();
        String result = stringWriter.toString();
        System.out.println(result);
        stringWriter.close();
        stringReader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

与字节数组流相比,字符数组流反而用得更少,因为StringBuilder和StringBuffer也能方便的用来存储动态长度的字符,而且大家更熟悉这些类。

本系列的其他文章
Java流编程实例之一–Java中的字节与字符
Java流编程实例之二–文件流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值