I/O流3

2.1、FileReader

        同FileInputStream,单位不同。

        读取:

            read()-->int,读取一个字符,返回值就是读到的数据,末尾-1.

            read(char[]cs)-->int,读取多个字符,存入cs字符数组中,返回值读取的个数。末尾-1

            read(char[]cs,intoff,intlen)-->int,读取多个字符,末尾-1

            字节流:操作的单位是字节,可以读取一个字节,也可以读取多个字节,存入字节数组:byte[] bs,

            字符流:操作的单位是字符,可以读取一个字符,也可以读取多个字符,存入字符数组:char[] cs,


        数据:计算机存储数据,都是采用2进制:01码

        单位:

                一个0或一个1,叫一个bit,位

                8个0或1,叫一个byte,字节


      所有的数据的本质,都是字节为单位的。

            图片,音频,视频,压缩文件,exe可执行文件,包括文本文件。。


    字符流:字符——>字符编码(GBK,UTF-8)

            a:97

            中:20013


【禁止】!!!使用字符流去操作非字符的文件。比如音频,视频,图片等等。。。


字符流:

        1、使用字节流(FileInputStream)读取一个文本文件(包含中文),边读边看(打印),乱码。原因?

                GBK,UTF-8,一个中文可能占多个字节。

               如果使用字节流读取数据,按照字节来读,一个字节一个字节的读取,读了一个字节,打印对应的字符,所以存在了乱码。一个汉字是多个字节,但是读一个字节看一个字节,肯定乱码。

        2、字符流 = 字节流 + 解码过程

            字节组合操作 ——>当前环境的编码集

                    字符流将读取的编码值,根据编码集,对应的字符。


        3、总结:

            所有的文件都可以是使用字节流。

                    图片,音频,视频,压缩文件,exe可以执行文件。。。

                    文本文件,建议使用字符流。因为里面都是文本(字符)。


2.2、FileWriter

    1、构造方法:

            FileWriter(String path);

           FileWriter(File file);

            FileWriter(String path,boolean append);

            FileWriter(File file, boolean append);


    2、写出数据

        void write(int),将参数这个字符,写出去

        void write(char[] cs),将整个cs数组的所有数据,全部写出

        void write(char[] cs,int off,int len),将cs数组的一部分写出,从下标off开始,len个

        void write(String s),直接将一个字符串写出

        void write(String s, int off,int len),写出字符串的一部分

    2.3、InputStreamReader

    2.4、OutputStreamWriter

        转换流:输入:InputStreamReader,继承了Reader,读取

        转换流:输出:OutputStreamWriter,继承了Writer,写出

        构造方法:

            InputStreamReader(InputStream);//读取字符为单位的数据

            OutputStreamWriter(OutputStream);//写出字符为单位的数据

            InputStreamReader(InputStream,"编码集");//读取字符为单位的数据

            OutputStreamWriter(OutputStream,"编码集");//写出字符为单位的数据

    转换了单位:字节-字符之间的桥梁

    设置编码:因为java采用的编码Unicode编码,程序应该使用utf-8的编码集。但是eclipse这个软件的工作空间,默认的编码集是gbk。为了一劳永逸,更改工作空间的编码集为utf-8。

OutputStream流:字节输出流

        FileOutputStream

                write(int),写一个字节

                write(byte[] bs ),写一个字节数组的数据

                write(byte[] bs,int off, int len),写出一个字节数组的一部分

               Writer流:字符输出流

    FileWriter

                write(int),写一个字符

                write(char[] cs),写一个字符数组的数据

                write(char[] cs,int off,int len)

                write(String s)

                write(String s,int off,int len)

A、4大基类流

        InputStream

        OutputSteam

        Reader

        Writer

B:文件流

        FileInputStream

        FileOutputStream

        FileReader

        FileWriter

C、缓存流

        BufferedInputStream

        BufferedOutputStream

        BufferedReader

        BufferedWriter

D、对象流

        ObjectInputStream

        ObjectOutputStream

E:转换流:

        InputStreamReader

        OutputStreamWriter

           转换单位:字节-字符之间的桥梁

            指明编码:


流的分类:

        流向:输入,输出

        单位:字节,字符

        功能:

            节点流:直接接触数据源的流

            处理流:也叫过滤流,套在别的流上的流。

                    关闭的时候:倒着关闭。或者干脆直接关闭处理流。

2.5、BufferedInputStream

2.6、BufferedOutoutStream

2.7、BufferedReader

        新增的方法:readLine()--->String,每次读取一行。

2.8、BufferedWriter

        新增的方法:newLine()-->void

        写换行:write("\r\n");


        缓存流(重点掌握):目的:高效。

                原理:自带了一个数组作为缓冲区。读写发生在数组上。数组占内存,速度很快。

        FileInputStream

                read()-->int,访问磁盘,操作文件,读一个字节回来。。

        BufferedInputStream

                read()-->int,先找缓冲区,从缓冲区中读取一个字节回来。fill(),读取磁盘文件,填充缓冲区

        byte[] bs ,作为缓冲区:1024*8。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容