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 ;
    }
}

posted @ 2011-03-19 19:00  donaldjohn  阅读(199)  评论(0编辑  收藏  举报