7.IO流 字节流/字符流

1. 字节流
     1. InputStream/OutputStream 都是抽象类,所以不能new对象,要借助子类完成,所以都是

直接子类FileInputStream/FileOutputStream is/os = new File…();

    2. 如果想加快效率,可以对FileInputStream/out.. 增加管道BufferedInputStream/out..
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path1)); 
BufferedOutputStream bos = new BufferedOutputStream(new FileInputStream(path2)); 

    3. 当然,FileInputStream/out 也可以自定义缓冲数组实现 Buffered的功能,在调用read/write 方法时,传入 自定义的数组即可

        自定义缓冲数组标准代码:

            FileInputStream fis = new FileInputStream("致青春.mp3");
            FileOutputStream fos = new FileOutputStream("copy.mp3");
            int len;
            byte[] arr = new byte[1024 * 8];        //自定义字节数组

            while((len = fis.read(arr)) != -1) {
                //fos.write(arr);
                fos.write(arr, 0, len);     //写出字节数组写出有效个字节个数
            }

            fis.close();
            fos.close();


        标准字节流代码:

            FileInputStream fis = new FileInputStream("致青春.mp3");
            FileOutputStream fos = new FileOutputStream("copy.mp3");
            byte[] arr = new byte[1024];
            int len;
            while((len = fis.read(arr)) != -1) {
                fos.write(len);     //写出字节数组写出有效个字节个数
            }

            fis.close();
            fos.close();

2. 字符流
    1.  基本使用方式 参考 字节流 

        FileReader---FileInputStream            BufferedReader---BufferedInputStream
        FileWriter---FileOutputStream           BufferedWriter---BufferedOutputStream

    2.  什么情况下使用字符流 

        只读/只写的情况下 考虑使用

        * 字符流**只能拷贝纯文本文件**, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
        * 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
        * 读取的时候是按照字符的大小读取的,不会出现半个中文
        * 写出的时候可以直接将字符串写出,不用转换为字节数组

    3.  BufferedReader的 reanLine,Writer的newLine方法 

        * BufferedReader的readLine()方法可以读取一行字符(不包含换行符号):更高效的读取文本
        * BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n"

                BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
                BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
                String line;
                while((line = br.readLine()) != null) {
                    bw.write(line);
                    //bw.write("\r\n");                 //只支持windows系统
                    bw.newLine();                       //跨平台的
                }

                br.close();
                bw.close(); 

    4. LineNumberReader: 

        * LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
            * 调用getLineNumber()方法可以获取当前行号
            * 调用setLineNumber()方法可以设置当前行号
        * 
                LineNumberReader lnr = new LineNumberReader(new FileReader("aaa.txt"));
                String line;
                lnr.setLineNumber(100);                                 //设置行号,默认值0
                while((line = lnr.readLine()) != null) {
                    System.out.println(lnr.getLineNumber() + ":" + line);//获取行号,第一行101而不是100
                }

                lnr.close(); 

    5. 使用指定的码表读写字符 
        看图就好了,代码里无非就是在 字符流inputStreamReader/outputStreamWriter后面 加一个 码表名称 "utf-8","GBK","unicode"等

        new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"),"utf-8"));




3. 内存输出流 ByteArrayOutputStream 

    ByteArrayOutputStream:

    * 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。 

    * 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据(避免字节流读取文字乱码)

    代码:

                FileInputStream fis = new FileInputStream("a.txt");
                ByteArrayOutputStream baos = new ByteArrayOutputStream();// 创建时,自动再内存中创建byte数组,并且会自动增长
                int b;
                while((b = fis.read()) != -1) {
                    baos.write(b);      //写到内存中
                }

                //byte[] newArr = baos.toByteArray();               //将内存缓冲区中所有的字节存储在newArr中,使用toByteArray 是可以制定 码表
                //System.out.println(new String(newArr));
                System.out.println(baos);    // 直接toString,是默认码表
                fis.close();    //内存输出流不需要关,因为是在内存中,没有与硬盘连接的管道
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值