字节流与字符流的区别&&用字节流好仍是用字符流好?

 

字节流java

(A)FileOutputStream(File name) 建立一个文件输出流,向指定的 File 对象输出数据。数据库

(B)FileOutputStream(FileDescriptor) 建立一个文件输出流,向指定的文件描述器输出数据。数组

(C)FileOutputStream(String name) 建立一个文件输出流,向指定名称的文件输出数据。性能

(D)FileOutputStream(String, boolean) 用指定系统的文件名,建立一个输出文件。编码

字符流spa

 

InputStreamReader 和 OutputStreamReader :对象

把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 。blog

InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。图片

使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。ip

InputStreamReader 的 read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。

为了达到更高效率,考虑用 BufferedReader 封装 InputStreamReader ,

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

相同点:

InputStream,OutputStream,Reader,writer都是抽象类。因此不能直接new 

字节流与字符流的区别

字节流和字符流使用是很是类似的,那么除了操做代码的不一样以外,还有哪些不一样呢?

区别:

一、字节流在操做的时候自己是不会用到缓冲区(内存)的,是与文件自己直接操做的,而字符流在操做的时候是使用到缓冲区的

二、字节流在操做文件时,即便不关闭资源(close方法),文件也能输出,可是若是字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,而且可使用flush方法强制进行刷新缓冲区,这时才能在不close的状况下输出内容

三、Reader类的read()方法返回类型为int :做为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00-0xffff),若是已到达流的末尾,则返回 -1
inputStream的read()虽然也返回int,但因为此类是面向字节流的,一个字节占8个位,因此返回 0 到 255 范围内的 int 字节值。若是由于已经到达流末尾而没有可用的字节,则返回值 -1。所以对于不能用0-255来表示的值就得用字符流来读取!好比说汉字.

四、字节流与字符流主要的区别是他们的的处理方式

字节流:处理字节和字节数组或二进制对象;

字符流:处理字符、字符数组或字符串。

那开发中究竟用字节流好仍是用字符流好呢?

1、字符(Reader和 Writer):中文,字符是只有在内存中才会造成的,操做字符、字符数组或字符串,

2、字节(InputStream 和OutputStream):音频文件、图片、歌曲,全部的硬盘上保存文件或进行传输的时候,操做字节和字节数组或二进制对象,

*若是要java程序实现一个拷贝功能,应该选用字节流进行操做(可能拷贝的是图片),而且采用边读边写的方式(节省内存)。

***

**缓冲区

缓冲区能够简单地理解为一段内存区域。
能够简单地把缓冲区理解为一段特殊的内存。
某些状况下,若是一个程序频繁地操做一个资源(如文件或数据库),则性能会很低,此时为了提高性能,就能够将一部分数据暂时读入到内存的一块区域之中,之后直接今后区域中读取数据便可,由于读取内存速度会比较快,这样能够提高程序的性能。
在字符流的操做中,全部的字符都是在内存中造成的,在输出前会将全部的内容暂时保存在内存之中,因此使用了缓冲区暂存数据。
若是想在不关闭时也能够将字符流的内容所有输出,则可使用Writer类中的flush()方法完成。

相关文章
相关标签/搜索