扩展:使用队列来优化递归操作.
队列特点:先进先出.
在jdk中有一个接口Queue 它有一个实现类叫LinkedList它其时就是一个队列。
如果要使用队列,插入 offer 获取使用 poll
使用队列来优化递归操作:是可以解决目录层次过多问题。
因为:递归操作可以理解成是纵向的遍历,如果目录层次比较多,在内存中存储的数据也多,会引起溢出。
使用队列,它是横向遍历,一层一层遍历,可以解决目录层次比较多问题。
因为使用队列,最多时候在内存中只存储了一层的信息。
最常用的就是树型结构。
<%@page import="java.io.File"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>使用递归来完成下载upload目录下所有文件</title>
</head>
<body>
<!-- 使用递归操作 -->
<%!//声明一个方法
public void getFile(File file) {
if (file.isDirectory()) {
//是目录
File[] fs = file.listFiles();
for (int i = 0; i < fs.length; i++) {
getFile(fs[i]); //递归调用
}
} else if (file.isFile()) {
//是文件
System.out.println(file.getName());
}
}%>
<%
String path = "D:\\java1110\\workspace\\day22_2\\WebRoot\\upload";
File uploadDirectory = new File(path);
getFile(uploadDirectory);
%>
</body>
</html>
<%@page import="java.io.File"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>使用队列来完成下载upload目录下所有文件</title>
</head>
<body>
<!-- 使用队列操作 -->
<%
String path = "D:\\java1110\\workspace\\day22_2\\WebRoot\\upload";
File uploadDirectory = new File(path);
//创建一个队列
Queue<File> queue = new LinkedList<File>();
queue.offer(uploadDirectory);
while (!queue.isEmpty()) { //如果队列不为空
File f = queue.poll(); //从队列中获取一个File
if(f.isDirectory()){//是目录,将目录下所有文件遍历出来,存储到队列中
File[] fs = f.listFiles();
for (int i = 0; i < fs.length; i++) {
queue.offer(fs[i]);
}
}else{
String absolutePath=(f.getAbsolutePath());
String p=absolutePath.substring(absolutePath.lastIndexOf("\\upload"));
out.println("<a href='/day22_2"+p+"'>"+f.getName()+"</a><br>");
}
}
%>
</body>
</html>