你的位置:首页 > Java教程

[Java教程]JSP学习笔记(7)


1.File类

File对象用来获取文件本身的一些信息,例如文件所在目录,文件的长度,文件读写权限等,不涉及文件的读写操作。

创建一个File对象的构造方法有3个:

File(String filename);//filename是文件名或文件的绝对路径File(String directoryPath,String filename);//文件路径和文件名File(File f,String filename);

使用第一种构造方法创建File对象时,filename是文件名会被认为与当前应用程序在同一个目录中。

File类常用方法

public String getName获取文件名
public boolean canRead()判断文件是否可读
public boolean canWrite()判断文件是否可写
public boolean exists()判断文件是否存在
public long length()获取文件的长度(单位是字节)
public String getAbsolutePath()获取文件的绝对路径
public String getParent()获取文件的父目录
public boolean isFile()判断文件是否是一个正常文件,而不是目录
public boolean isDirectory()判断文件是否是一个目录
public boolean isHidden()判断文件是否是隐藏文件
public long lastModified()获取文件最后修改的时间(时间从1970年午夜到文件最后修改时刻的毫秒数)

 

1.1.创建目录

  • File对象调用public boolean mkdir()创建一个目录,成功返回true,失败返回false。

1.2.列出目录中的文件

  • public String[] list()用字符串形式返回目录下的全部文件
  • public File[] listFiles()用File对象形式返回目录下全部文件

1.3.列出指定类型文件

  • public String[] list(FilenameFilter obj)用字符串形式返回目录下指定类型的所有文件
  • public File[] listFiles(FilenameFilter obj)用File对象返回目录下指定类型的所有文件

1.4.删除文件和目录

  • public boolean delete()可以删除当前对象代表的文件或目录;如果是目录,目录必为空;成功返回true。

2.读写文件的常用流

java.io包提供了大量的流类,其中InputStream、OutputStream、Reader、Writer是最重要的四个抽象类。

InputStream类及其子类对象为字节输入流;

OutputStream类及其子类对象为字节输出流;

Reader类及其子类对象为字符输入流;

Writer类及其子类对象为字符输出流。

 

使用输入流的4个步骤:

(1)设定输入流的源

(2)创建指向源的输入流

(3)让输入流读取源中的数据

(4)关闭输入流

 

使用输出流的4个步骤:

(1)给出输出流的目的地

(2)创建指向目的地的输出流

(3)让输出流吧数据写入到目的地

(4)关闭输出流

2.1.字节输入流

创建

FileInputStream(String name);fileInputStream(File file);//可能出现I/O错误

try{ FileInputStream in=new FileInputStream("hello.txt");//创建指向源的输入流}catch(IOException e){ System.out.print(e);}

File f=new File("hello.txt");//指定输入流的源try{ FileInputStream in = new FileInputStream(f);//创建指向源的输入流}catch(IOException e){ System.out.print(e);}

读取字节

字节输入流的read方法以字节为单位读取源中的数据。

int read()读取单个字节的数据,返回字节值(0~255之间的一个整数),如未读出字节就返回-1
int read(byte b[])读取b.length个字节到字节数组b中,返回实际读取的字节数目,如到达文件的末尾,返回-1
int read(byte b[],int off,int len)读取len个字节到字节数组b中,并返回实际读取字节数目,如到达文件末尾,返回-1;off指定b中存放读取数据的开始位置

关闭流

使用完之后应该关闭流,close()

2.2.字节输出流

创建

FileOutputStream(String name);FileOutputStream(File file);
try{ //创建指向目的地的输出流 FileOutputStream out=new FileOutputStream("hello.txt");}catch(IOException e){ System.out.peint(e);}或File f=new File("hello.txt");try{ FileOutputStream out=new FileOutputStream(f);}catch(IOException e){ System.out.print(e);}
具有刷新功能的输出流
FileOutputStream(String name,boolean append);FileOutputStream(File file,boolean appemd);

如果参数append取值为true,输出流不会刷新指向的文件(假设文件已存在),输出流的write方法将从文件的末尾开始向文件写入数据;参数append取值false,输出流将刷新所指向的文件(假设文件已存在)。

写字节

字节输出流的write方法以字节单位向目的地写数据:

void write(int n)向目的地写数据
void write(byte b[])向目的地写入单个字节
void write(byte b[],int off,int len)从给定字节数组中起始于偏移量off处获取len个字节写到目的地

关闭流

close();

2.3.字符流

字节流是使用字节读取数据,不能很好的操作Unicode字符,比如汉字在文件中占两个字节,如果使用字节流,可能会出现乱码。这里我们就要使用字符流了。

FileReader文件字符输入流:

   FileReader(String filename);

   FileReader(File file);

FileWriter文件字符输出流:

   FileWriter(String filename);

   FileWriter(File file);

   FileWriter(String filename,boolean append);

   FileWriter(File file,boolean append);

FileReader和FileWriter分别是Reader和Writer的子类。

字符输入流和输出流的read和write方法使用字符数组读写数据,就是以字符为基本单位处理数据。

2.4.缓冲流

BufferedReader和BufferedWriter类创建的对象称为缓冲输入、输出流,二者增强了读写文件的能力。他们的源和目的地必须是字符输入流和字符输出流。通过字符输入流和BufferedReader的配合使用,使用readLine()方法可实现按行读取数据,字符输入流原本不能按行读取数据。

BufferedReader和BufferedWriter的构造方法:

    BufferedReader(Reader in);

    BufferedWriter(Writer out);

FileReader in = new FileReader("hi.txt");BufferedReader buin = BufferedReader(in);String strLine = buin.readLine();FileWriter out = new FileWriter("hi.txt");BufferedWriter buout = BufferedWriter(out);buout.write("pinnsvin",3,4);//向hi.txt中写入"nsvi"

readLine()读取文本行
write(String s,int off,int len)字符串s从off处开始写入len个字符
newLine()向文件中写入回行符
flush()刷新缓存
close()关闭流

 

3.RandomAccessFile类

RandomAccessFile类不是InputStream或OutputStream的子类,习惯上称RandomAccessFile创建的对象为一个流,它的指向既可以是源也可以是目的地。

对文件进行读写操作时,就可以创建一个RandomAccessFile对象。

RandomAccessFile类的构造方法:

  • RandomAccessFile(String name,String mode) 参数name是文件名,给出创建的流的源或目的地,mode文件的访问权限,取r(只读)或rw(可读写)
  • RandomAccessFile(File file,String mode)参数file是一个File对象,创建对象时应该捕获IO异常

RandomAccessFile类常用方法

方法名功能
getFilePointer()获取当前流在文件中的读写位置
length()获取文件的长度
readByte()从文件读取一个字节
readDouble()从文件读取一个双精度浮点值(8个字节)
readInt()从文件读取一个int值(4个字节)
readLine()从文件读取一个文本行
readUTF()从文件读取一个UTF字符串
seek(long a)定位到当前流距离文件开头a个字节数的位置
write(byte b[])向文件写入b.length个字节
writeDouble(double v)向文件写入一个双精度浮点值
writeInt(int v)向文件写入一个int值
writeUTF(String s)向文件写入一个UTF字符串

4.文件上传

要上传文件到服务器,JSP页面必须有File类型的表单,并且表单中必须将ENCTYPE的属性值设为“multipart/form-data”

<form action="接受文件上传页面" method="post" ENCTYPE="multipart/form-data">  <input type="file" name="test"/></form>

JSP引擎可以让内置对象request调用getInputStream()方法获取一个输入流,通过这个输入流读入用户上传的全部信息。

upload.jsp

<%@ page contentType="text/html;charset=utf-8" %><HTML><BODY> <P>选择要上传的文件:<BR>  <FORM action="accept.jsp" method="post" ENCTYPE="multipart/form-data">   <INPUT type=FILE name="boy" size="38"> <BR>   <INPUT type="submit" name ="g" value="提交">  </BODY></HTML>

accept.jsp

<%@ page contentType="text/html;charset=utf-8" %><%@ page import ="java.io.*" %><HTML><BODY><%try{ InputStream in=request.getInputStream();File f=new File("d:/story","B.txt");FileOutputStream o=new FileOutputStream(f);byte b[]=new byte[1000];int n;while((n=in.read(b))!=-1){o.write(b,0,n); }o.close();in.close();}catch(IOException ee){}out.print("文件已上传"); %> </BODY></HTML>

5.文件下载

JSP内置对象response调用getOutputStream()方法可以获取一个指向用户的输出流,服务器将文件写入这个流,用户就可以下载这个文件了。当提供下载功能时,应该使用response对象向用户发送HTTP头消息,浏览器就会调用相应的外部程序打开下载的文件。

response调用setHeader方法添加下载头的格式:

   response.setHeader(“Content-disposition”,”attachment;filename=”下载文件名”);

download.jsp

<%@ page contentType="text/html;charset=utf-8" %><HTML><BODY><P>点击超链接下载Zip文档book.Zip <BR> <A href="loadFile.jsp">下载book.zip</Body></HTML>

loadFile.jsp

<%@ page contentType="text/html;charset=utf-8" %><%@ page import="java.io.*" %><HTML><BODY><% //获得响应客户的输出流:  OutputStream o=response.getOutputStream();  //输出文件用的字节数组,每次发送500个字节到输出流:  byte b[]=new byte[500];//下载的文件:  File fileLoad=new File("d:/story","book.zip");  //客户使用保存文件的对话框:  response.setHeader("Content-disposition","attachment;filename="+"book.zip"); //通知客户文件的MIME类型:  response.setContentType("application/x-tar");  //通知客户文件的长度:  long fileLength=fileLoad.length();  String length=String.valueOf(fileLength);  response.setHeader("Content_Length",length);  //读取文件book.zip,并发送给客户下载:  FileInputStream in=new FileInputStream(fileLoad);  int n=0;  while((n=in.read(b))!=-1)   { o.write(b,0,n);   }%></BODY></HTML>