IO流简单应用


1.IO流的回顾
    按流向区分:
        输入流    InPutStream  FileInPutStream    Reader    
        输出流    OutPutStream FileOutPutStream    Writer    

    按读取类型区分
        字节流    InPutStream  OutPutStream
        字符流    Reader        Writer

2.引入了小数组的形式来解决读写效率低的问题
        byte[] arr = new byte[1024*8];    
        
        

3. 高效缓冲输入流,和输出流
        缓冲输入流    BufferedInPutStream
        缓冲输出流    BufferedOutPutStream

        public class Test55 {
            public static void main(String[] args) throws  IOException {
                BufferedInputStream  bis =  new BufferedInputStream(new FileInputStream("aa.mp4"));
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bb.mp4"));
                int b;
                while((b= bis.read()) !=-1){
                    bos.write(b);
                }
                bis.close();
                bos.close();
            }
        }
            
        
4. 刷新flush、 和close方法的区别。

    当我们写出的时候,担心有字节没有写出完全,可以用刷新的方法。

        一般我们关闭流通道的时候,用close()方法。
        底层他会每次先刷新流通道,调用flush()方法。


5. 字节流读写中文的问题。

        中文是字符。一个字符占两个字节的位置。

        所以按照字节去读取的时候,有可能读取到半个中文。
        那么就会造成乱码!!
    
        写出的时候,也是按照字节来写出的时候,也有可能把相邻的两个
        字节拼接出问题,导致,和我们预期输出的中文错乱。
        
        
        public class Test6 {
            public static void main(String[] args) throws IOException {
        //        input();    //测试读取中文,可能出现乱码问题。
                output();    //测试写出中文,可能会出现的乱码问题。
            }
            
            private static void output() throws IOException {
                // TODO 这里还有没完成的功能,需要测试输出流,写出中文乱码问题。
                FileOutputStream fos = new FileOutputStream("abc.txt");
                //将字符串,转化为字节数组来输出。
                fos.write("我读书少,你不要骗我!".getBytes());  
                fos.close();
            }

            //测试读取中文,可能出现乱码问题。
            public static void input() throws IOException{
                FileInputStream fis =  new FileInputStream("a.txt");
                byte[] arr = new byte[3];
                
                int len;        //读取到的字节,转化为int类型数据。
                while(( len = fis.read(arr)) != -1){
                    //自己读取,都是半个半个字符读取,可能会造成乱码原因。
                    System.out.println(new String(arr,0,len));  
                }
                fis.close();
            }
        }

        
        
        
6.字符流        Reader  Writer
        
        FileReader
        FileWriter
        
        (1)什么时候用字节流,什么时候用字符流。
            用字节流
                用来拷贝文件的时候用字节流。
            
            用字符流        
                用来把文件中的 文本内容,读取到内存中用的时候用字符流。
                或者把程序中的字符串,写出到文件中的时候,用字符流。
            
        (2)字符流能用来拷贝非文本文件吗 ?
                不可以。
            
7. 综合练习: 读取文本,替换字符串。写出到另一个文本。

    需求:将 a.txt中的一下文本,读取之后,进行替换
            你好,我的名字是{name},
            我是一只{type},
            我的主人是{master}。
        替换之后
            你好,我的名字是{哮天犬},
            我是一只{狗},
            我的主人是{二郎神}。
        最终,把替换后的字符串,写入 b.txt文件中。
            
    具体代码:
        public class Test7 {
            public static void main(String[] args) throws IOException {
                FileReader fr = new FileReader("b.txt"); // 字符读取流对象创建
                StringBuffer sb = new StringBuffer(); // 创建一个字符串缓冲对象。
                char[] arr = new char[1024]; // 定义一个字符数组,
                int len; // 返回读取到的数组长度。
                while ((len = fr.read(arr)) != -1) {
                    sb.append(arr); // 把数组中的字符,拼接到字符串对象中。
                }
                // 替换读取到的文本的内容。
                String info = sb.toString().replace("name", "哮天犬");
                String info2 = info.replace("type", "狗");
                String newinfo = info2.replace("master", "二郎神");
                // 创建文件输出流对象,然后写出字符串内容。
                FileWriter fw = new FileWriter("bbb.txt");
                fw.write(newinfo);
                fr.close(); // 关闭流通道
                fw.close();// 关闭流通道。
                System.out.println("写出完成");
            }
        }


8.     高效缓冲字符输入流,和高效缓冲字符输出流
        BufferedReader 
        BufferedWriter

        /**
         * 
         * 高效缓冲字符输入流 高效缓冲字符输出流。
         */
        public class Test8 {
            public static void main(String[] args) throws IOException {
                BufferedReader br = new BufferedReader(new FileReader("a.txt")); // 创建高效读取流。
                BufferedWriter bw = new BufferedWriter(new FileWriter("bbbb.txt")); // 创建高效输出流。

                int b; // 读取到的字符数。
                while ((b = br.read()) != -1) { // 循环读取 缓冲字符数组序列。
                    bw.write(b); // 把内存缓冲区的字符数组,输出。
                }
                // 关闭输入和输出流通道。
                br.close();
                bw.close();
                System.out.println("拷贝完毕!");
            }
        }

9. 通过io流给文件加密解密
        /**
         *  通过io流操作,图片加密。
         *  //加密,是输出的时候,亦或 ^ 一个数。
         *  
         *  解密的时候,把加密过的文件。再次亦或同一个 密钥数。
         *  那么就解密出来了。
         */
        public class Test9 {
            public static void main(String[] args) throws IOException {
                FileInputStream fis = new FileInputStream("a.jpeg");
                FileOutputStream fos = new FileOutputStream("aa.jpeg");
                
                int b;
                while((b=fis.read()) !=-1){
                    fos.write(b ^ 123);   //加密,是输出的时候,亦或 ^ 一个数。
                }
                fis.close();
                fos.close();
            }
        }
    
    
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值