Java流编程实例之三--字节数组流和字符数组流
2016-09-16 16:52
351 查看
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流编程实例之二–文件流
相关文章推荐
- ★Java语法(二)——————————数据类型常见问题
- Java集合系列—ArrayList详细介绍
- Java String 综述(上篇)
- SpringMVC request生命周期
- 设计模式之状态模式
- 浅析Java集合类源码(二)--- HashSet, HashMap, Hashtable
- spark+java1.8+lamda wordCount 实例,并且实现按单词出现的次数的倒序排序
- Java自定义生成与解析(Dom4J)XML文件
- 用java简单的实现单链表的基本操作
- Spring4深入理解IOC&DI03----Bean配置--SpEL,IOC 容器中 Bean 的生命周期
- 域名申请绑定项目 项目发部 外网访问无无需加项目名 小白的小白教程
- Java注释
- 使用java语言将数组中的数据写入txt文件,然后读取
- JAVA进阶2.4——finally
- java ArrayList vector 线程安全
- 变量和常量
- Mac下使用Android Studio出现“install JDK 1.8”版本问题
- 生产者消费者模式Java实现
- Java 内部类
- JDK环境变量