• IO流(二)


    1:递归(理解)
    (1)方法定义中调用方法本身的现象
    举例:老和尚给小和尚讲故事,我们学编程。
    (2)递归的注意事项;

    • 1:递归一定要有出口,否则就是死递归;
    • 2:递归的次数不能太多,否则就内存溢出;
    • 3:构造方法不能递归使用.

    (3)递归的案例:
    A:递归求阶乘;
    B:兔子问题(斐波那契数列);
    C:递归输出指定目录下所有指定后缀名的文件绝对路径;
    D:递归删除带内容的目录(小心使用).

    2:IO流(掌握)
    (1)IO用于在设备间进行数据传输的操作
    (2)分类:
     A:流向
      输入流 读取数据
      输出流 写出数据

     B:数据类型:
     字节流
       字节输入流 读取数据 InputStream
       字节输出流 写出数据 OutputStream
     字符流
       字符输入流 读取数据 Reader
       字符输出流 写出数据 Writer


      注意:

    • 1:如果我们没有明确说明按照什么分,默认按照数据类型分。
    • 2:除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。

    每种基类的子类都是以父类名作为后缀名

       XxxOutputStream
       XxxInputStream
       XxxReader
       XxxWriter

    (3)FileOutputStream写出数据
    A:操作步骤
      1:创建字节输出流对象
      2:调用write()方法写数据
      3:释放资源

    B:代码体现:

    FileOutputStream fos = new FileOutputStream("fos.txt");
    
    fos.write("hello".getBytes());
    
    fos.close();

    C:要注意的问题?
     1:创建字节输出流对象做了几件事情?

    • 1:调用系统功能去创建文件;
    • 2:创建fos对象;
    • 3:把fos对象指向这个文件.

     2:为什么一定要close()?

    • 1:让流对象变成垃圾,这样就可以被垃圾回收器回收;
    • 2:通知系统去释放跟该文件相关的资源.

     3:如何实现数据的换行?

      因为你值写了字节数据,并没有写入换行符号。
     如何实现呢?写入换行符号即可。
     因为不同的系统针对不同的换行符号识别是不一样的?
       windows:
       linux:
       Mac:
     而一些常见的个高级记事本,是可以识别任意换行符号的。

    d:如何实现数据的追加写入?

    用构造方法带第二个参数是true的情况即可。

    FileOutputStream fos = new FileOutputStream("a.txt", true);

    (4)FileInputStream读取数据
    A:操作步骤
      a:创建字节输入流对象;
      b:调用read()方法;
      c:释放资源.

    B:代码体现:

    FileInputStream fis = new FileInputStream("fos.txt");
    
    //方式1
        int by = 0;
        while((by=fis.read())!=-1) {
            System.out.print((char)by);
        }
    
    //方式2
        byte[] bys = new byte[1024];
        int len = 0;
        while((len=fis.read(bys))!=-1) {
            System.out.print(new String(bys,0,len));
    }
    
        fis.close();

    (5)案例:2种实现
    A:复制文本文件
    B:复制图片
    C:复制视频

    数据源:
     c:\a.txt -- 读取数据-- FileInputStream
    目的地:
     d:\b.txt -- 写出数据 -- FileOutputStream

    (6)字节缓冲区流

      通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。
     既然是这样的话,那么,java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。
     这种类被称为:缓冲区类(高效类,高级流)
       写数据:BufferedOutputStream
       读数据:BufferedInputStream

     构造方法可以指定缓冲区的大小,但是我们一般用不上,因为默认缓冲区大小就足够了。
     为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?
     原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。

    (7)案例:4种实现
    A:复制文本文件
    B:复制图片
    C:复制视频

    3:字节流和字符流
    IO流分类
     字节流:
      InputStream
      FileInputStream
      BufferedInputStream
      OutputStream
      FileOutputStream
      BufferedOutputStream

     字符流:
      Reader
      FileReader
      BufferedReader
      Writer
      FileWriter
      BufferedWriter

  • 相关阅读:
    原型模板分享——国外高阶版“大众点评”TripAdvisor
    插画手绘入门教程
    十大用户体验设计失败案例,你知道吗?
    用摹客,轻松管理设计规范!
    摹客“独门绝技”之评论审阅篇
    政务管理系统原型模板分享
    产品经理如何做需求分析?
    python基础知socket编程
    异常处理
    元类,__call__方法和单例模式
  • 原文地址:https://www.cnblogs.com/crazypokerk/p/9090395.html
Copyright © 2020-2023  润新知