• Java SE 第八十八,八十九,九十讲 递归深度剖析 IO流深入详解,递归作业详解


    1.所谓递归(Recursion),就是方法调用自身,对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环.

    2.作业:给定任意一个目录,以树形方式展现该目录中所有子目录和文件.另外,在展现的时候将目录排在上面,文件排在下面.每一层要加上缩进.

    3.Java程序通过流来完成输入/输出.流失生产或消费信息的抽象.流通过Java的输入/输出系统与物理设备链接.尽管与他们链接的物理设备不尽相同,所有流的行为具有同样的方式.这样,相同的输入/输出类和方法适用于所有类型的外设.这意味着一个输入流能够抽象多种不同的类型的输入:从磁盘文件,从键盘,从网络套接字.同样,一个输出流可以输出到控制台,磁盘文件或相连的网络,六十处理输入/输出的一个洁净方法,例如它不需要代码理解键盘和网络的不同.Java中流的实现是在java.io包中定义的层次机构内部的.

    4.输入/输出是相对程序来说的:程序使用数据时所扮演的角色有两个:一个是源,一个是目的.

    若程序是数据流的源,及数据的提供者,这个数据流对程序来说就是一个"输出数据流"(数据从程序流出).若程序是数据的终点,这个数据流对程序而言就是一个"输入数据流",(数据从程序外流向程序)

    5.功能上分:输入流/输出流

    6.流结构上:字节流/字符流

    7.字节流的基础是InputStream和OutputStream这两个抽象类.

    字符流的基础是抽象类Reader和Writer.

    8.读数据的逻辑为:

    open a stream

    while more informatin

    read information

    close the stream

    9.写数据的逻辑:

    open a stream

    while more information

    write information

    close the stream

    10.第三种分类:节点流:

    从特定的地方读写的流类.

    与目标交互的一定是节点流.

    过滤流:使用节点流作为输入或输出.过滤刘是使用一个已经存在输入流或输出流链接创建的.

    11.InputStream和OutputStream为顶层类,他们都是抽象类(abstract).

    12.InputStream三个基本读的方法:

    abstract int read():读取一个字节数据,并返回读到的数据.如果返回-1,表示读到了输入流的末尾.

    int read(byte[] b):将数据读入一个字节数组,同时返回实际读取的字节数.如果返回-1,表示读到了输入流的末尾.

    int read(byte[] b,int off,int len):将数据读入一个字节数组,同时返回实际读取的字节数,如果返回-1,表示读到了输入流的末尾.off指定在数组b中存放数据的起始偏移位置;len表示读取的最大字节数.

    思考:为什么只有第一个read方法是抽象的,而其余两个read方法是具体的?

    因为第二个read方法依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现.所以所只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现.

    13.FileInputStream类中的read()的实现如下: public native int read() throws IOException;//Java是不能直接和底层打交道,所以委托于c语言实现.因此这个方法表示native.

    14.InputStream常用的处理形式:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;


    public class IOTest
    {
        public static void main(String[] args) throws IOException
        {
            File file = new File("D:/test.txt");
        FileInputStream is  = new  FileInputStream(file);
        byte[] by = new byte[200];
       
       
       
        int length;
       
        while(-1 !=(length = is.read(by)))
        {
        String result =  new String(by,0,length);   
        System.out.println(result);
       
        }
        is.close();//注意使用完流一定要注意关闭.
        }
       

    }

    15.递归作业实现:

    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    public class ShowAll
    {
        private static int i = 0;
        public static void showAll(File fileName)
        {   
            List<File>   list = new ArrayList<File>();
            File[] files = fileName.listFiles();
            for(File tmp : files)
            {   
                if(!tmp.isFile())
                    {
                    System.out.println(align(i)+tmp.getName());
                    i++;
                    showAll(tmp);
                    i--;
                }
                else
                    list.add(tmp);
            }
            for(File tmp1 : list)
                    System.out.println(align(i)+tmp1.getName());
        }
        public static void main(String[] args)
        {
            File f = new File("D:/KwDownload");
            ShowAll.showAll(f);
        }
        public static String  align(int count)
        {
            String space = "|";
            for(int i = 0; i < count * 10; i++)
            {
                space += "-" ;
            }
            return space ;
        }
    }

  • 相关阅读:
    INSERT INTO ON DUPLICATE KEY UPDATE
    page to frame
    指定人提交
    在结构体嵌入接口
    排序 /src/sort/zfuncversion.go:136
    Modification should be made to copies of the returned MD.
    setTimeout 定时器的编号 实际延时比设定值更久的原因:最小延迟时间
    IOPS(Input/Output Operations Per Second)是一个用于计算机存储设备(如硬盘(HDD)、固态硬盘(SSD)或存储区域网络(SAN))性能测试的量测方式,可以视为是每秒的读写次数。和其他性能测试一样,存储设备制造商提出的IOPS不保证就是实际应用下的性能。
    Working Around Memory Leaks in Your Django Application
    celery 内存泄露
  • 原文地址:https://www.cnblogs.com/donaldjohn/p/1988987.html
Copyright © 2020-2023  润新知