chap14-I/O流


一.概念

  • I/O:I(Input输入)/O(output输出)流–数据从内存到存储设备之间的传输通道

二.流的分类

  • 按照单位分类

      字节流:以字节为单位进行数据传输,例:图片,视频,音频,文本...
      字符流:以字符为单位进行数据传输,例:文本
    
  • 按照方向分类

      输入流:指从<存储设备>到<内存>的数据通道---上传
      输出流:指从<内存>到<存储设备>的数据通道---下载
    
  • 按照功能分类

      节点流:实际传输数据的流---M416--发射子弹
      过滤流:增强节点流功能的流---消音,硝烟,扩容弹夹,倍镜,垂直握把,三角握把,枪托,红点
    
  • 使用:单位+方向+功能+流—字节输出节点流
    在这里插入图片描述

三.字节流

  • 字节输出流父类/字节输入流父类:OutputStream/InputStream

    • 字节输出流父类–方法(写)

       write(int b):将字节b写入输出流
       write(byte[] bs):将字节数组写入输出流
       write(byte[] bs,int pos,int len):将字节数组从下标pos开始的len个字节写入输出流
      
    • 字节输入流父类–方法(读)

        read():一次读入一个字节
        read(byte[] bs):一次读入一个字节数组
        read(byte[] bs,int pos,int len):一次读入数组中从pos下标开始的len个字节
      
  • 字节输出节点流/字节输入节点流:FileOutputStream/FileInputStream

    • 字节输出节点流:FileOutputStream

        FileOutputStream(String name):向指定文件name文件传输数据
        //写出数据覆盖原有数据
        FileOutputStream fos=new FileOutputStream("files/a.txt",true);
        //在文件尾部添加数据
        注:
        	//相对路径:相对于项目文件在的位置-项目下的路径
        	//绝对路径:相对电脑来说文件的位置-盘符:/文件夹/.../文件(不建议使用)
        	//文件夹和文件之间可以用:/ 或者 \\
        	//如果参数为文件,文件存在直接使用,文件不存在自动创建
        	//如果参数为文件路径(文件夹/.../文件),如果文件夹不存在报错
      
    • 字节输入节点流:FileInputStream

        FileInputStream(String name):从指定文件name中读取数据
      
      • read():一次读入一个字节

           while(true) {
          	int i = fis.read();
          	if(i==-1)break;//读取到文件尾部返回-1
          	//通过i操作文件数据
          }
        
      • read(byte[] bs):一次读入一个字节数组

          while(true) {
          	int i=fis.read(bs);//读取到的有效字节个数
          	if(i==-1)break;//读取到文件尾部返回-1
          	for(int j=0;j<i;j++) {
          		//通过bs[j]操作文件数据
          	}
          }
        
      • read(byte[] bs,int pos,int len):一次读入数组中从pos下标开始的len个字节

          while(true) {
          	int i = fis.read(bs,1,4);//读取到的有效字节个数
          	if(i==-1)break;//读取到文件尾部返回-1
          	for(int j=1;j<i+1;j++) {
          		//通过bs[j]操作文件数据
          	}
          }
        
  • 字节输出缓冲流/字节输入缓冲流:BufferedOutputStream/BufferedInputStream

    • 字节输出缓冲流:BufferedOutputStream

        new BufferedOutputStream(OutputStream os):创建字节输出缓冲区增强参数节点流的功能
        //flush():将缓冲区中的数据放到存储设备中,清空缓冲区,刷新缓冲区
        //close():关闭流,任何流使用完都需要进行关闭,关闭流之前 自动清空缓冲区
      
    • 字节输入缓冲流:BufferedInputStream

        new BufferedInputStream(InputStream is):创建字节输入缓冲流增加参数字节输入节点流的功能
        	//循环读取:
        	while(true) {
        		int i = bis.read();
        		if(i==-1)break;
        		//通过i操作文件数据
        	}
      
    • 作用:减少访问磁盘的次数,提高IO的读写效率

      在这里插入图片描述

  • 字节输出对象流/字节输入对象流:ObjectOutputStream/ObjectIputStream

    • 作用:

        读写基本类型的数据 writeDouble()/ReadDouble()
        读写String数据 writeUTF()/readUTF()
        读写对象 writeObject()/readObject()
        增强缓冲区功能
      
    • 对象序列化:

      • 把对象在流上进行传输过程称为对象序列化

      • 要求:

          必须实现java.io.Serializable接口(标识性接口--空接口)
          transient可以修饰属性,属性值不再对象序列化(不在流上传输)
          所有属性都必须实现对象序列化
          输出对象是一个容器,容器内所有元素都必须实现对象序列化
        
      • 循环读取:

          while(true){
          	try{
          		Object o=ois.readObject();
          		//通过o获取所有对象
          	}catch(EOFException e){
          		break;
          	}
          }
        

四.流的标准异常处理

  • JDK1.7处理方式

      FileOutputStream fos=null;
      try {
      	fos = new FileOutputStream("files/f.txt");
      	fos.write(65);
      } catch (FileNotFoundException e) {
      	// TODO Auto-generated catch block
      	e.printStackTrace();
      } catch (IOException e) {
      	// TODO Auto-generated catch block
      	e.printStackTrace();
      }finally {
      	try {
      		if(fos!=null)fos.close();
      	} catch (IOException e) {
      		// TODO Auto-generated catch block
      		e.printStackTrace();
      	}
      }
    
  • JDK1.7之后自动关流

      try(FileOutputStream fos = new FileOutputStream("files/f.txt");) {
      	fos.write(65);
      } catch (FileNotFoundException e) {
      	// TODO Auto-generated catch block
      	e.printStackTrace();
      } catch (IOException e) {
      	// TODO Auto-generated catch block
      	e.printStackTrace();
      }
    

五.编码格式

  • 字符集

      GBK:简体中文
      GB2312:简体中文
      GB18030:简体中文(最新)
      UTF-8:万国码
      ISO-8859-1:西欧
      BIG5:繁体中文
    
  • 编解码

      编码:将文字转为二进制码的过程
      解码:将二进制转为文字的过程
    
  • 乱码:

      编码格式(使用字符集)和解码格式不一致
    

六.字符流

  • 字符输出流/字符输入流:Writer/Reader

    • 字符输出流:Writer

        write(int c):写出一个字符
        write(char[] cs):写出一个字符数组
        write(char[] cs,int off,int len):写出字符数组从下标off开始的len个字符
        write(String s):写出一个字符串
        write(String s,int off,int len):写出字符串中从下标off开始的len个字符
      
    • 字符输入流:Reader

        read():读入一个字符
        read(char[] cs):读入一个字符数组
        read(char,int off,int len):读入字符数组的一部分
      
  • 字符输出节点流/字符输入节点流:FileWriter/FileReader

    • 字符输出节点流:FileWriter

        自带缓存区
      
    • 字符输入节点流:FileReader

        while(true) {
        int i = fr.read();
        if(i==-1)break;//读取到文件尾部取-1
        //通过i获取文件内容
        }
      
  • 字符输出缓冲流/字符输入缓冲流:BufferedWriter/BufferedReader

    • 字符输出缓冲流:BufferedWriter

      newLine():输出一个换行符

    • 字符输入缓冲流:BufferedReader

      readLine():读入一行文本

        while(true) {
        String s = br.readLine();
        if(s==null)break;//读取到文件尾部取值null
        //通过s获取文件数据
        }
      
  • 字符输出缓冲流:PrintWriter

    • 作用:
      • print():输出数据不换行

      • println():输出数据并换行

      • PrintWriter 既可以作为过滤流,又可以作为节点流

          PrintWriter(Writer w)
          printWriter(String fileName)
        
  • 字符输出桥转换流/字符输入桥转换流:OutputStreamWriter/InputStreamReader

    • 使用步骤:

        //创建字节输入输出的节点流
        //创建字符输入输出的桥转换流
        //创建字符输入输出的缓冲流
      
    • 作用:

        将字节流转为字符流
        设置输入输出的编码格式
      

七.File类

  • 概念:

      IO:操作文件内容,读写数据
      File:操作文件本身
    
  • 位置:java.io包

  • 常用方法:

      createNewFile():创建文件
      mkdirs():创建文件夹和子文件夹
      getAbsolutePath():返回文件的绝对路径
      getName():返回文件名
      list():显示当前文件夹下的文件和文件夹名
      exists():判断文件是否存在
      ...
    

 
 
 
 

看完如果对你有帮助,感谢点赞支持!
                                           在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值