java文件io之字符流和字节流

1、 比特、字节和字符的定义

     这个很基础,但是在开头说一下还是有必要的

     比特:bit(binarydigit),信息的基本单元。只有两种取值:0或者1.

     字节:通常由8比特组成。由于通常用来编辑计算机上文本的单个字符,所以字节是很多的计算机架构中的内存的最小可寻址单元

     字符:信息单元;大概相当于1个字母或者符号等。比如数字,字母,标点符号等。英文字符一般由1个字节组成。汉字一般由两个字节组成

2、 字节流和字符流的区别?

所谓流就是连续访问文件的一种方式。字节流就是一个字节一个字节访问文件。字节流适合除了文本文件外的任何类型的文件。例如,如果文件使用了unicode编码,每个字符使用的是两个字节表示,那么字节流就会将这两个字节流单独对待,导致的结果是你必须在后续自己去转换(成原来的字符)

类似地,字符流就是一个字符一个字符的读取文件。为了工作正常,字符流需要提供文件的编码。

3、 字节流和字符流分别对应的类

     所有字节流类都是InputStream或OutputStream的子类。最主要的两个是FileInputStream和FileOutputStream。    

    什么时候不适用字节流?

       字节流代表的是一种低级别的I/O,所以应该尽量避免使用。尤其是文本文件,包含的是字符,最好的方式是使用字符流。字节流只考虑用在最原始的I/O上。但是字节流是所有其他流的基础。 

字符流:

   Java平台使用Unicode协议保存字符值。字符流I/O自动在这些内部格式和本地字符集间进行转换。

  所有的字符流类都是Reader和Writer的子类。

字符流经常会“封装”字节流。字符流使用字节流来操作物理I/O,然后字符流执行字节和字符间的转换。比如,FileReader使用FileInputStream、FileWriter使用FileOutputStream。

4、 字节流和字符流之间的转换

使用InputStreamReader可以将字节流转换成字符流;

使用OutputStreamWriter类可以将字符流转换成字节流。

当你创建InputStreamReader和OutputStreamWriter对象,你可以指定你想要转换的编码。比如为了将一个编码为UTF8的文件转换成Unicode,创建InputStreamReader如下:

           FileInputStream fis = new FileInputStream("test.txt");

InputStreamReader isr = newInputStreamReader(fis, "UTF8");

    如果忽略,就会使用默认的编码。可以通过如下获取使用的编码:

               InputStreamReader defaultReader = new InputStreamReader(fis);

                                                       String defaultEncoding =defaultReader.getEncoding();

5、种类划分

               1)、 所有字节流都是低端流,所有字符流都是高端流。区分:所有的流对象的后缀中包含Reader或者Writer的都是高端流,反之,则基本上为低端流,不过也有例外,比如PrintStream就是高端流

            2)、在实例化流的对象的过程中,不需要传入另外一个流作为自己构造方法的参数的流,称之为原始流。在实例化流的对象的过程中,需要传入另外一个流作为自己构造方法发参数的流,称之为包装流。区分:所以的低端流都是原始流,所以的高端流都是包装流。

           3)、字节流用来处理声音或者图片等二进制的数据,字符流用来处理文本数据(如txt文件)

          综上所述:字符流是字节流的包装流(我认为类似Integer和int的区别),每次用字符流处理的过程,底层都是用字节流来实现的。字节流主要来处理声音或者图片等二进制的数据,字符流主要用来处理文本数据(如txt文件)。

转载地址:https://blog.csdn.net/allenalex/article/details/50829317




            

猜你喜欢

转载自blog.csdn.net/a274537260/article/details/80293213