IO流

1286134-20181208090041144-1561147209.png

流分类:
  • 流向:输入流和输出流
  • 数据:字节流和字符流
字符流和字节流和文件:
  • 字节流:可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的,包括二进制、音频、视频、doc等
    输入流:InputStream FileInputStream
    输出流:OutputStream FileOutputStream
        FileInputStream fis = new FileInputStream("aaa.mp3");   //创建输入流对象,关联aaa.mp3
        FileOutputStream fos = new FileOutputStream("bbb.mp3");//创建输出流对象,关联bbb.mp3,如果没有bbb.txt,会创建出一个
        
        int b;
        while((b = fis.read()) != -1) { //没读到内容时返回-1
            fos.write(b);
        }
        
        fis.close();
        fos.close();
        FileInputStream fis = new FileInputStream("xxx.mp3");
        FileOutputStream fos = new FileOutputStream("copy.mp3");
        byte[] arr = new byte[fis.available()];                 //根据文件大小做一个字节数组
        fis.read(arr);                                          //将文件上的所有字节读取到数组中
        fos.write(arr);                                         //将数组中的所有字节一次写到了文件上
        fis.close();
        fos.close();

        FileInputStream fis = new FileInputStream("xxx.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();
  • 字符流:只能处理纯文本,全部为可见字符,txt、html
    输入流:Reader FileReader
    输出流:Writer FileWriter
//字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.
//FileReader类的read()方法可以按照字符大小读取
//FileWriter类的write()方法可以自动把字符转为字节写出
        FileReader fr = new FileReader("a.txt");
        FileWriter fw = new FileWriter("b.txt");
        
        int ch;
        while((ch = fr.read()) != -1) {
            fw.write(ch);
        }
        
        fr.close();
        fw.close();
        FileReader fr = new FileReader("aaa.txt");          //创建字符输入流,关联aaa.txt
        FileWriter fw = new FileWriter("bbb.txt");          //创建字符输出流,关联bbb.txt
        
        int len;
        char[] arr = new char[1024*8];                      //创建字符数组
        while((len = fr.read(arr)) != -1) {                 //将数据读到字符数组中
            fw.write(arr, 0, len);                          //从字符数组将数据写到文件上
        }
        
        fr.close();                                         //关流释放资源
        fw.close(); 
操作:

1)建立联系 File对象
2)选择流
3)操作 数组大小+read、write
4)释放资源

处理流:

增强功能,提高性能,节点流之上
一、缓冲流
1)字节缓冲流
BufferedInputStream BufferedOutputStream


        FileInputStream fis = new FileInputStream("aaa.mp3");           //创建文件输入流对象,关联aaa.mp3
        BufferedInputStream bis = new BufferedInputStream(fis);         //创建缓冲区对fis装饰
        FileOutputStream fos = new FileOutputStream("copy.mp3");        //创建输出流对象,关联copy.mp3
        BufferedOutputStream bos = new BufferedOutputStream(fos);       //创建缓冲区对fos装饰
        
        int b;
        while((b = bis.read()) != -1) {     
            bos.write(b);
        }
        
        bis.close();                        //只关装饰后的对象即可
        bos.close();

2)字符缓冲流
BufferedReader BufferedWriter

//BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
//BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率

        BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));  //创建字符输入流对象,关联aaa.txt
        BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));  //创建字符输出流对象,关联bbb.txt
        
        int ch;             
        while((ch = br.read()) != -1) {     //read一次,会先将缓冲区读满,从缓冲区中一个一个的返给临时变量ch
            bw.write(ch);                   //write一次,是将数据装到字符数组,装满后再一起写出去
        }
        
        br.close();                         //关流
        bw.close();  
// 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(); 

二、转换流:字节流转字符流,处理乱码

//FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
//FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)

        BufferedReader br =                                     //高效的用指定的编码表读
                new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8"));
        BufferedWriter bw =                                     //高效的用指定的编码表写
                new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK"));
        int ch;
        while((ch = br.read()) != -1) {
            bw.write(ch);
        }
        
        br.close();
        bw.close();
IO流(flush和close方法的区别)
  • flush()方法
    • 用来刷新缓冲区的,刷新后可以再次写出
  • close()方法
    • 用来关闭流释放资源的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写

转载于:https://www.cnblogs.com/StephenChenin/p/9141798.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值