文件操作核心类File
JSP的文件操作是与通过调用Java核心包中的File类完成。File位于java .io包中。在jsp页面中用<%@ page import="java.io.*"%>来导入。
File主要是完成文件的命名、查询文件属性和处理目录等操作。它不进行文件内容的读写。
1.获取文件属性。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <font size="2"> <%
//用构造函数创建一个文件实例 File file=new File("/home/jim/Development/apache-tomcat-7.0.30/webapps/Root/index.jsp"); //获取文件名 out.print("文件名称"); out.print(file.getName()); out.print("<br>"); //获取文件绝对路径 out.print("文件绝对路径:"); out.print(file.getAbsolutePath()); out.print("<br>"); //获取上层路径 out.print("文件上层路径:"); out.print(file.getParent()); out.print("<Br>"); //判断是否为目录 out.print("是否为目录"); out.print(file.isDirectory()); out.print("<br>"); //获取文件大小 out.print("文件长度:"); out.print(file.length()); out.print("<br>"); //判断是否可读 out.print("是否可读:"); out.print(file.canRead()); out.print("<br>"); //判断是否可写 out.print("是否可写:"); out.print(file.canWrite()); out.print("<br>"); //获取上次修改时间,用1970年午夜至今的毫秒数表示 out.print("上次修改时间"); out.print(file.lastModified()); out.print("<br>");
%> </font> </body> </html>
显示结果为:
2.创建目录
通过File类的mkdir()方法,可以在指定路径处创建目录。
前提是Tomcat进程具有创建目录的权限。
1 <%@ page language="java" contentType="text/html; charset=GB18030" 2 pageEncoding="GB18030"%> 3 <%@ page import="java.io.*" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <font size="2"> 12 <% 13 File dir=new File("/home/jim/Development/apache-tomcat-7.0.30/webapps/ROOT/","testCreateDir"); 14 %> 15 在<%=dir.getParent() %>下创建一个新的目录<%=dir.getName() %>,<br> 16 目录是否存在:<%=dir.exists() %><br> 17 创建是否成功 :<%=dir.mkdir() %><Br> 18 检查是否为目录:<%=dir.isDirectory() %><br> 19 </font> 20 </body> 21 </html>
第一次运行:
证明创建成功了。
第二次运行:
因为目录已经存在,所以创建失败了。
3.遍历目录
File类提供了list()方法和listFiles()方法来获取文件和目录清单。
如果当前File类的实例是一个目录,那么这两个方法会返回这个目录下的所有文件和子目录。
3.1list()方法
list()返回的类型是String[],存储的是他们的路径。
下面的例子掩饰了获取目录下子目录和文件信息,进行遍历目录操作。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="java.io.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <font size="2" <%! void tree(String args,JspWriter out,int level){ try{ int index=level; File pathName=new File(args); String[] files=pathName.list(); if(files==null||files.length==0){ return; } for(int i=0;i<files.length;i++){ File f=new File(pathName.getPath(),files[i]); if(f.isDirectory()){ for(int k=0;k<index;k++) out.print("  "); out.print(f.getName()); out.print("<br>"); tree(f.getAbsolutePath(),out,index+1); } else{ for(int k=0;k<index;k++) out.print("  "); out.print("|--"); out.print(f.getName()); out.print("<br>"); } } }catch(Exception e){ e.printStackTrace(); } } %> <% String dir="/home/jim/Development/apache-tomcat-7.0.30/webapps"; tree(dir,out,0); %> ></font> </body> </html>
运行结果为:
3.2listFiles()方法
listFiles()返回的类型是File[],是Files类型的引用,而不是字符串。
同list()方法一样,listFiles()方法返回的结果中可能包含目录,他们也有自己的文件和子目录。因此需要递归调用listFiles()方法遍历整个目录。
3.3带有过滤功能的list()和listFiles()
如果需要列出目录下指定类型的文件,可以使用带有过滤功能的list()方法。
public String [] list(FilenameFileter filter);
该方法用字符串形式返回目录下指定类型的所有文件。
public File [] listFiles(FilenameFileter filter);
该方法用File对象返回目录下指定类型的所有文件。
而FilenameFilter是一个接口,该接口规定了一个方法:
public Boolean accept(File dir,String name);
在调用list方法时,传递一个实现该接口的对象,将用accept方法检查是否符合要求。
下面的例子列出了后缀名为".html"的文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@page import="org.eclipse.jdt.internal.compiler.ast.PostfixExpression"%> 2 <%@ page language="java" contentType="text/html; charset=GB18030" 3 pageEncoding="GB18030"%> 4 <%@ page import="java.io.*" %> 5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 6 <html> 7 <head> 8 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 9 <title>Insert title here</title> 10 </head> 11 <body> 12 <font size="2"> 13 <%! 14 void tree(String args,JspWriter out,int level){ 15 try{ 16 int index=level; 17 File pathName=new File(args); 18 //构造文件名过滤器 19 PostfixFilter filter =new PostfixFilter("html"); 20 //列出文件和子目录 21 String[] files=pathName.list(filter); 22 if(files==null||files.length==0){ 23 return; 24 } 25 for(int i=0;i<files.length;i++){ 26 File f=new File(pathName.getPath(),files[i]); 27 if(f.isDirectory()){ 28 for(int k=0;k<index;k++) 29 out.print("  "); 30 out.print(f.getName()); 31 out.print("<br>"); 32 tree(f.getAbsolutePath(),out,index+1); 33 } 34 else{ 35 for(int k=0;k<index;k++) 36 out.print("  "); 37 out.print("|--"); 38 out.print(f.getName()); 39 out.print("<br>"); 40 } 41 } 42 }catch (Exception e){ 43 e.printStackTrace(); 44 } 45 } 46 //实现文件名过滤接口的类 47 class PostfixFilter implements FilenameFilter{ 48 String str=""; 49 public PostfixFilter(String postfix){ 50 str="."+postfix; 51 } 52 //接口的accept方法 53 public boolean accept(File dir,String name){ 54 File file=new File(dir,name); 55 //可以接受目录 56 if(file.isDirectory()) return true; 57 //可以接受指定后缀的文件 58 return name.toLowerCase().endsWith(str.toLowerCase()); 59 } 60 } 61 %> 62 <% 63 String dir="/home/jim/Development/apache-tomcat-7.0.30/webapps/examples/jsp"; 64 tree(dir,out,0); 65 %> 66 </font> 67 68 </body> 69 </html>
运行结果为:
4.删除文件和目录
文件删除操作使用File类的delete()方法,删除成功返回true,否则为false。
删除目录时,只有当此目录是空目录时,才允许删除。因此如果需要删除整个目录,必须向前面的例子一样,递归地遍历所有目录,删除所有文件,才能完全删除整个目录。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page language="java" contentType="text/html; charset=GB18030" 2 pageEncoding="GB18030"%> 3 <%@ page import="java.io.*" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <font size="2"> 12 <% 13 File dir=new File("/home/jim/Development/apache-tomcat-7.0.30/webapps/ROOT/testCreateDir"); 14 %> 15 在<%=dir.getPath() %>下删除文件:<br> 16 <% 17 File[] files=dir.listFiles(); 18 String isfile; 19 //判断文件目录下是否有文件或子目录 20 if((files!=null&&files.length!=0)){ 21 for(int i=0;i<files.length;i++){ 22 //判断是否为文件 23 if(files[i].isFile()) 24 isfile="文件"; 25 else{ 26 //判断目录是否为空 27 if(files[i].list().length==0) 28 isfile="空目录"; 29 else isfile="非空目录"; 30 } 31 out.print("删除"+isfile+files[i].getName()+":"); 32 //删除文件 33 if(files[i].delete()){ 34 out.print("成功"); 35 } 36 else out.print("失败"); 37 out.print("<br>"); 38 } 39 } 40 %> 41 删除目录<%=dir.getPath() %> 42 <% 43 if(dir.delete()) out.print("成功"); 44 else out.print("失败"); 45 %> 46 </font> 47 </body> 48 </html>
在要删除的文件夹的内容如下:
而“未命名文件夹”不为空,“未命名文件夹2”为空。
执行代码,结果如下:
可见只有文件夹为空才可以删除。