1、 File 类
File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件读写权限等,不涉及对文件的读写操作。创建一个File对象的构造方法有3个:
File(String filename);
File(String directoryPath,String filename);
File(File f, String filename); (f是指定成一个目录的文件)
使用 File(String filename)创建文件时,该文件被认为是与当前应用程序在同一目录中,由于 JSP引擎是在 bin下启动执行的,所以该文件被认为在下列目录中:
D:\Tomcat\jakarta-tomcat-4.0\bin\ 。
2、获取文件的属性
经常使用 File类的下列方法获取文件本身的一些信息:
1. public String getName():获取文件的名字。
2. public boolean canRead():判断文件是否是可读的。
3. public boolean canWrite():判断文件是否可被写入。
4. public boolean exits():判断文件是否存在。
5. public long length():获取文件的长度(单位是字节)。
6. public String getAbsolutePath():获取文件的绝对路径。
7. public String getParent():获取文件的父目录。
8. public boolean isFile():判断文件是否是一个正常文件,而不是目录。
9. public boolean isDirectroy():判断文件是否是一个目录。
10. public boolean isHidden():判断文件是否是隐藏文件。
11. public long lastModified():获取文件最后修改的时间(时间是从 1970年午夜至文件最后修改时刻的毫秒数)。
3、创建目录
(1)创建目录
File对象调用方法:public boolean mkdir()创建一个目录,如果创建成功返回 true,否则返回
false(如果该目录已经存在将返回 false)。
<% File dir=new File("D:/Tomcat/jakarta-tomcat-4.0/webapps/root","Students"); %>
<P> 在 root下创建一个新的目录:Student,<BR>成功创建了吗?
<%=dir.mkdir()%>
<P> Student是目录吗?
<%=dir.isDirectory()%>
4、列出指定类型的文件
列出指定类型的文件,public String[] list(FilenameFilter obj); 该方法用字符串形式返回目录下的指定类型的所有文件。 public File [] listFiles(FilenameFilter obj); 该方法用 File对象返回目录下的指定类型所有文件。 FilenameFile是一个接口,该接口有一个方法: public boolean accept(File dir,String name);当向 list方法传递一个实现该接口的对象时,list方法在列出文件时,将让该文件调用accept方法检查该文件是否符合 accept方法指定的目录和文件名字要求。
<%! class FileJSP implements FilenameFilter
{ String str=null;
FileJSP(String s)
{str="."+s; }
public boolean accept(File dir,String name)
{ return name.endsWith(str); }
}
%>
<% File dir=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root/");
FileJSP file_jsp=new FileJSP("jsp");
String file_name[]=dir.list(file_jsp);
for(int i=0;i<5;i++)
{out.print("<BR>"+file_name[i]);
}
%>
5、 删除文件和目录
File对象调用方法 public boolean delete()可以删除当前对象代表的文件或目录,如果 File对象表示的是一个目录,则该目录必须是一个空目录,删除成功返回 true。
<%File f=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root/","A.java");
File dir=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root","Students");
boolean b1=f.delete();
boolean b2=dir.delete();
%>
6、使用字节流读写文件
Java的 I/O流提供一条通道程序,可以使用这条通道把源中的数据送给目的地。把输入流的指向称做源,程序从指向源的输入流中读取源中的数据。而输出流的指向是数据要去的一个目的地,程序通过向输出流中写入数据把信息传递到目的地,
InputStream类的常用方法:
2 int read(): 输入流调用该方法从源中读取单个字节的数据,该方法返回字节值(0~255之间的一个整数),如果未读出字节就返回-1。
int read(byte b[]):2 输入流调用该方法从源中试图读取 b.length个字节到b中,返回实际读取的字节数目。如果到达文件的末尾,则返回-1。
int read(byte b[], int off, int len): 2 输入流调用该方法从源中试图读取 len个字节到b中,并返回实际读取的字节数目。如果到达文件的末尾,则返回-1,参数off指定从字节数组的某个位置开始存放读取的数据。
void close():2 2 输入流调用该方法关闭输入流。
long skip(long numBytes): 输入流调用该方法跳过numBytes个字节,并返回实际跳过的字节数目。
OutputStream类的常用方法:
2 void write(int n): 输出流调用该方法向输出流写入单个字节。
2 void write(byte b[]): 输出流调用该方法向输出流写入一个字节数组。
2 void write(byte b[],int off,int len):从给定字节数组中起始于偏移量 off处取len个字节写到输出流。
2 void close():关闭输出流。
7、 FileInputStream 和 FileOutputStream类 :
FileInputStream该类是从InputStream中派生出来的简单输入类。
FileInputStream(String name); FileInputStream(File file);
第一个构造方法使用给定的文件名 name创建一个 FileInputStream对象,第二个构造方法使用 File对象创建 FileInputStream对象。参数 name和 file指定的文件称做输入流的源,输入流通过调用 read方法读出源中的数据。
File f = new File("myfile.dat");
FileInputStream istream = new FileInputStream(f);
FileOutputStream
FileOutputStream提供了基本的文件写入能力。除了从 FileOutputStream类继承来的方法以外,FileOutputStream类还有两个常用的构造方法,这两个构造方法如下所示:
FileOutputStream(String name); FileOutputStream(File file);
第一个构造方法使用给定的文件名name创建一个FileOutputStream对象。第二个构造方法使用File对象创建FileOutputStream对象。参数name和 file指定的文件称做输出流的目的地,通过向输出流中写入数据把信息传递到目的地。
使用 FileInputStream的构造方法:FileInputStream(String name)创建一个输入流时,以及使用 FileOutputStream的构造方法:FileOutputStream(String name)创建一个输出流时要保证文件和当前应用程序在同一目录下。由于JSP引擎是在 bin下启动执行的,所以文件必须在bin目录中。
在下面的例子 6中,服务器将若干内容写入一个文件,然后读取这个文件,并将文件的内容显示给客户。
<%File dir=new File("D:\\tomcat\\webapps\\root\\","Studentssssssss");
dir.mkdir();
File f=new File(dir,"hello.txt");
try{
FileOutputStream outfile=new FileOutputStream(f);
BufferedOutputStream bufferout=new BufferedOutputStream(outfile);
byte b[]="你们好,很高兴认识你们呀!<BR>nice to meet you".getBytes();
bufferout.write(b);
bufferout.flush();
bufferout.close();
outfile.close();
FileInputStream in=new FileInputStream(f);
BufferedInputStream bufferin=new BufferedInputStream(in);
byte c[]=new byte[90];
int n=0;
while((n=bufferin.read(c))!=-1)
{ String temp=new String(c,0,n);
out.print(temp); }
bufferin.close();
in.close();
}
catch(IOException e)
{
}
%>
8、Reader类中常用方法:
2 int read():输入流调用该方法从源中读取一个字符,该方法返回一个整数0~65535之间的一个整数,Unicode字符值),如果未读出字符就返回-1。
int read(char b[]):2 输入流调用该方法从源中读取b.length个字符到字符数组 b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。
2 输入流调用该方法从源中读取len个字符int read(char b[], int off, int len): 并存放到字符数组 b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。其中,off参数指定 read方法从符数组b中的什么地方存放数据。
void close():2 输入流调用该方法关闭输入流。
long skip(long numBytes): 2 输入流调用该方法跳过numBytes个字符,并返回实际跳过的字符数目。
9、Writer类中常用方法:
2 void write(int n): 向输入流写入一个字符。
void write(byte b[]): 向输入流写入一个字符数组。
void write(byte b[],int off,int length): 2 从给定字符数组中起始于偏移量off处取 len个字符写到输出流。
void close():2 关闭输出流。
10、 FileReader 和 FileWriter类
在下面的例子 7中,服务器将若干内容写入一个文件,然后读取这个文件,并将文件的内容显示给客户。
<%
File dir=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root","Students");
dir.mkdir();
File f=new File(dir,"apple.txt");
try{FileWriter outfile=new FileWriter(f);
BufferedWriter bufferout=new BufferedWriter(outfile);
bufferout.write("你好:");
bufferout.newLine();
bufferout.write("好久不见了,近来在忙什么呢?");
bufferout.newLine();
bufferout.write("欢迎来玩");
bufferout.newLine();
bufferout.write("2002年 8月 8日");
bufferout.flush();
bufferout.close();
outfile.close();
FileReader in=new FileReader(f);
BufferedReader bufferin=new BufferedReader(in);
String str=null;
while((str=bufferin.readLine())!=null)
{out.print("<BR>"+str);
}
bufferin.close();
in.close();
}
catch(IOException e) { }
下面的例子 8是一个网络英语单词测试,客户首先访问 Example4_8.jsp页面,该页面通过输入流技术将一个文本文件读入,这个文本的每一行是一个英语单词选择练习,如下所示:
English.txt:
#Take an umbrella with you in case___#it will rain#it rains#it raining#it rained#B#
#He is no longer the honest man___he was#who#whom#which#that#D#
#During the recession, thousands of workers were____#laid on#laid down#laid out#laid off#B#
#The building casts a large__on the ground#shadow#shade#shanpoo#shawl#D#
#The driver came close to ___killed for speeding#having been#have been#be#being#A#
然后把文本的每一行都存入客户的session对象中,并用行号做关键字,需要时可通过这个关键字在 session对象中查找这一行,同时,将一个分数属性也存入客户的 session对象中。
客户点击“开始练习”按钮进入练习页面 Exercise.jsp,该页面从客户的session对象中首先取出第一行,然后通过StringTokenizer类将该行的语言符号取出。将第一个语言符号作为试题,第 2到第 4个语言符号作为选择,第 5个语言符号是该试题的答案,把该题的答案存入客户的 session对象中,将来根据题号在session对象中检索这个答案。当客户点击该页面中的“提交答案”按钮后再从session对象取出下一行,依次类推。
图 4.9 英语单词测试练习
例子 8(效果如图 4.9所示)
Example4_8.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%@ page import ="java.util.*" %>
<% int i=0;
String str=null;
Integer score=new Integer(0);
Integer number=new Integer(0);
session.setAttribute("score",score);
session.setAttribute("序号",number);
try{ //englishi.txt存放在 f:/2000目录下。
File f=new File("f:/2000","English.txt");
FileReader in=new FileReader(f);
BufferedReader buffer=new BufferedReader(in);
while((str=buffer.readLine())!=null)
{i++;
session.setAttribute(""+i,str);
}
} catch(IOException e) { }
%>
<HTML>
<BODY>
<P><BR>点击按钮进入练习页面:
<FORM action="Exercise.jsp" method="post" name=form>
<Input type=submit value="开始练习">
</FORM>
</BODY> </HTML>
Exercise.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%@ page import ="java.util.*" %>
<HTML>
<BODY>
<% String option[]=new String[7];
int 题号=0;
if(!(session.isNew()))
{ Integer number=(Integer)session.getAttribute("序号");//获取题号。
if(number==null)
{number=new Integer(0);
}
number=new Integer(number.intValue()+1);//将题号加1。
session.setAttribute("序号",number); //更新序号
int i=0;
String str=(String)session.getAttribute(""+number);//获取行号是number的文本。
if(str==null)
{str="#练习结束#练习结束#练习结束#练习结束#练习结束#再见#"; }
StringTokenizer tokenizer=new StringTokenizer(str,"#");//分析该行文本。
while(tokenizer.hasMoreTokens())
{option[i]=tokenizer.nextToken();
i++; }
题号=number.intValue();
session.setAttribute("答案"+题号,option[5]); //将该题答案存入 session。
out.print("<BR>"+"试题"+number+"<BR>"+option[0]);
out.print("<BR>请选择您的答案:");
out.print("<FORM action=Exercise.jsp method=post name=form>");
out.print("<BR>"+"<Input type=radio name=R value=A>");
out.print("A. "+option[1]);
out.print("<BR>"+"<Input type=radio name=R value=B>");
out.print("B. "+option[2]);
out.print("<BR>"+"<Input type=radio name=R value=C>");
out.print("C. "+option[3]);
out.print("<BR>"+"<Input type= radio name=R value=D>");
out.print("D. "+option[4]);
out.print("<BR>"+"<Input type=submit name=submit value=提交答案 >");
out.print("</FORM>");
}
%>
<% String answer=request.getParameter("R");//获取客户提交的答案。
//获取题目的标准答案,需要注意的是:客户提交答案后,该页面就将题号增加1
// 因此,要给客户的上一题进行评判必须将题号减1。
String 答案=(String)session.getAttribute("答案"+(题号-1));
if(answer==null)
{answer="您没有给出选择呢"; }
if(answer.equals(答案))
{ Integer score=(Integer)session.getAttribute("score");
score=new Integer(score.intValue()+1);
session.setAttribute("score",score);
}
out.print("<BR>"+"您现在的得分是:"+session.getAttribute("score"));
out.print("<BR>"+"你的上一题的选择是:"+answer);
out.print("<BR>"+"上一题的正确答案是:"+答案);
%>
</BODY>
</HTML>
11、回压字符流
称PushbackReader类创建的对象为回压字符流。回压流可以使用unread(char ch)将一个字符回压到该流中,被回压的字符是该回压流紧接着再调用read()方法时最先读出的字符。回压流可以用来监视读出的信息,当读出一个不需要的信息时,可以不处理该信息,而将需要的信息回压,然后再读出回压的信息。该类的构造方法是: PushbackReader(Reader in);
当我们使用前面讲的字节输入流或字符输入流把JSP文件或超文本文件发送给客户时,客户的浏览器将解释运行超文本标记,客户无法看见原始的超文本文件和JSP文件。我们可以使用回压流技术,读取原始的网页文件,当读取到“<”符号时,将“<”回压、读取到“>”时,将“>”回压。
<%File f=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root","Example2_4.jsp");
try{ FileReader in=new FileReader(f) ;
PushbackReader push=new PushbackReader(in);
int c;
char b[]=new char[1];
while ( (c=push.read(b,0,1))!=-1)//读取 1个字符放入字符数组b。
{ String s=new String(b);
if(s.equals("<")) //回压的条件
{ push.unread('&');
push.read(b,0,1); //push读出被回压的字符字节,放入数组 b.
out.print(new String(b));
push.unread('L');
push.read(b,0,1); //push读出被回压的字符字节,放入数组b.
out.print(new String(b));
push.unread('T');
push.read(b,0,1); //push读出被回压的字符字节,放入数组 b.
out.print(new String(b));
}
else if(s.equals(">")) //回压的条件
{ push.unread('&');
push.read(b,0,1); //push读出被回压的字符字节,放入数组b.
out.print(new String(b));
push.unread('G');
push.read(b,0,1); //push读出被回压的字符字节,放入数组b.
out.print(new String(b));
push.unread('T');
push.read(b,0,1); //push读出被回压的字符字节,放入数组b.
out.print(new String(b));
} else if(s.equals("\n"))
{ out.print("<BR>");
} else
{out.print(new String(b)); }
}
push.close();
} catch(IOException e){}
%>