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