javaSE中字符流字节流以及转换流的总结
2016-10-13 21:49
239 查看
InputStream:得到的是字节输入流,InputStream.read("filename")之后,得到字节流
Reader:读取的是字符流
InputStreamReader:从字节到字符的桥梁。InputStreamReader(InputStream.read("filename"));
reader.read(InputStreamReader(InputStream in));便可从字节变为字符,打印显示了。
java.io.Reader 和 java.io.InputStream 组成了Java 输入类。
Reader 用于读入16位字符,也就是Unicode 编码的字符;而
InputStream 用于读入 ASCII 字符和二进制数据。
Reader支持16位的Unicode字符输出,
InputStream支持8位的字符输出。
Reader和InputStream分别是I/O库提供的两套平行独立的等级机构,
1byte = 8bits
InputStream、OutputStream是用来处理8位元的流,
Reader、Writer是用来处理16位元的流。
而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。
值得说明的是,在这两种等级机构下,还有一道桥梁InputStreamReader、OutputStreamWriter负责进行InputStream到Reader的适配和由OutputStream到Writer的适配。
在 Java中,有不同类型的 Reader 输入流对应于不同的数据源:
FileReader 用于从文件输入; CharArrayReader 用于从程序中的字符数组输入; StringReader 用于从程序中的字符串输入; PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。
相应的也有不同类型的 InputStream 输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。
另外,还有两种没有对应 Reader 类型的 InputStream 输入流: Socket 用于套接字; URLConnection 用于 URL 连接。 这两个类使用 getInputStream() 来读取数据。
相应的,java.io.Writer 和 java.io.OutputStream 也有类似的区别。
关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:
byte[] b = new byte[1024 *8]; //最好是1028的整数倍
int len= 0; // 已经成功读取的字节的个数,或者最后末尾的长度
while ((len = is.read(arr)!=-1) {
//TO-DO something,可以进行syso操作以及output操作等
}
//最后别忘记了关流,不然文件不完整,会有数据留在缓冲区,除非手动调用flush方法,否则进行文件拷贝的时候会因为缺少字节而失败
is.close();
//blog迁移自apkbus论坛:http://www.apkbus.com/blog-327389-58485.html
Reader:读取的是字符流
InputStreamReader:从字节到字符的桥梁。InputStreamReader(InputStream.read("filename"));
reader.read(InputStreamReader(InputStream in));便可从字节变为字符,打印显示了。
java.io.Reader 和 java.io.InputStream 组成了Java 输入类。
Reader 用于读入16位字符,也就是Unicode 编码的字符;而
InputStream 用于读入 ASCII 字符和二进制数据。
Reader支持16位的Unicode字符输出,
InputStream支持8位的字符输出。
Reader和InputStream分别是I/O库提供的两套平行独立的等级机构,
1byte = 8bits
InputStream、OutputStream是用来处理8位元的流,
Reader、Writer是用来处理16位元的流。
而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。
值得说明的是,在这两种等级机构下,还有一道桥梁InputStreamReader、OutputStreamWriter负责进行InputStream到Reader的适配和由OutputStream到Writer的适配。
在 Java中,有不同类型的 Reader 输入流对应于不同的数据源:
FileReader 用于从文件输入; CharArrayReader 用于从程序中的字符数组输入; StringReader 用于从程序中的字符串输入; PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。
相应的也有不同类型的 InputStream 输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。
另外,还有两种没有对应 Reader 类型的 InputStream 输入流: Socket 用于套接字; URLConnection 用于 URL 连接。 这两个类使用 getInputStream() 来读取数据。
相应的,java.io.Writer 和 java.io.OutputStream 也有类似的区别。
关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:
byte[] b = new byte[1024 *8]; //最好是1028的整数倍
int len= 0; // 已经成功读取的字节的个数,或者最后末尾的长度
while ((len = is.read(arr)!=-1) {
//TO-DO something,可以进行syso操作以及output操作等
}
//最后别忘记了关流,不然文件不完整,会有数据留在缓冲区,除非手动调用flush方法,否则进行文件拷贝的时候会因为缺少字节而失败
is.close();
//blog迁移自apkbus论坛:http://www.apkbus.com/blog-327389-58485.html
相关文章推荐
- string字符串操作以及整数和字符转换的总结
- Java基础学习总结(14)---File类、字节流与字符流、字节字符转换流
- JavaSE 学习参考:字节流和字符流转换
- 文件路径以及相关字符格式转换
- C++多字节字符转换为宽字符(以及相反)的两种方法
- Android中关于dip和px以及转换的总结
- 字符数组,字符指针,字符串常量以及其sizeof的一些总结
- Java 字节流和字符流的相互转换
- 字符数组,字符指针,字符串常量以及其sizeof的一些总结
- 视频管理模块代码总结 (3)上传flash 以及flash格式转换工具
- Android中关于dip和px以及转换的总结(重点推荐文章)
- 字符数组,字符指针,字符串常量以及其sizeof的一些总结
- ASP中利用ADODB.Stream对象将字节流转换为字符流
- 关于字符和数字类型的索引,Oracle如何实现内部自动转换以及索引使用的验证测试
- j2me常用的字符,日期,以及转换编码实现
- 20110831日的总结--关于原始流与字符流之间的转换中的设计问题
- 对java中的输入/输出的总结(字节流,字符流)
- 字节流和字符流转换
- JAVA中关于IO流中的字符流和字节流的个人总结
- android中关于dip和px以及转换的总结