JSP 中的文件操作
JSP 中的文件操作
1.File 类
File 类的对象主要用来获取文件本身的一些信息。
创建一个 File 对象的构造方法有3 个:
File(String filename);
File(String directoryPath,String filename);
File(File f, String filename);
filename 是文件名字,directoryPath 是文件的路径,f 是指定成一个目录的文件。
使用 File(String filename)创建文件时,该文件被认为是与当前应用程序在同一目录中,由于JSP 引擎是在bin 下启动执行的,所以该
文件被认为在下列目录中:D:\Tomcat\jakarta-tomcat-4.0\bin\ 。
1.获取文件的属性
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 年午夜至文件最后修改时刻的毫秒数)
2.创建目录
(1)创建目录
File 对象调用方法:public boolean mkdir()创建一个目录,如果创建成功返回true,否则返回false(如果该目录已经存在将返回false)。
(2)列出目录中的文件
如果 File 对象是一个目录,那么该对象可以调用下述方法列出该目录下的文件和子目录:
public String[] list():用字符串形式返回目录下的全部文件,
public File [] listFiles():用File 对象形式返回目录下的全部文件。
(3)列出指定类型的文件
可以使用File 类的下述两个方法,列出指定类型的文件:
public String[] list(FilenameFilter obj); 该方法用字符串形式返回目录下的指定类型的所有文件。
public File [] listFiles(FilenameFilter obj); 该方法用File 对象返回目录下的指定类型所有文件。
FilenameFile 是一个接口,该接口有一个方法:
public boolean accept(File dir,String name);
当向 list 方法传递一个实现该接口的对象时,list 方法在列出文件时,将让该文件调用accept 方法检查该文件是否符合accept 方法指定的目录和文件名字要求。
3.删除文件和目录
File 对象调用方法public boolean delete()可以删除当前对象代表的文件或目录,如果File 对象表示的是一个目录,则该目录必须是一个空目录,删除成功返回true。
2 使用字节流读写文件
java.io 包提供大量的流类。所有字节输入流类都是InputStream(输入流)抽象类的子类,而所有字节输出流都是OutputStream(输出流)抽象类的子类。
InputStream 类的常用方法:
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 指定从字节数组的某个位置开始存放读取的数据。
void close(): 输入流调用该方法关闭输入流。
long skip(long numBytes): 输入流调用该方法跳过numBytes 个字节,并返回实际跳过的字节数目。
OutputStream 类的常用方法:
void write(int n): 输出流调用该方法向输出流写入单个字节。
void write(byte b[]): 输出流调用该方法向输出流写入一个字节数组。
void write(byte b[],int off,int len): 从给定字节数组中起始于偏移量off 处取len 个字节写到输出流。
void close(): 关闭输出流
2.1.FileInputStream 和 FileOutputStream 类
FileInputStream 该类是从InputStream 中派生出来的简单输入类。该类的所有方法都是从InputStream 类继承来的。
两个构造方法:
FileInputStream(String name); name:文件名
FileInputStream(File file); file:File对象
参数name 和file 指定的文件称做输入流的源,输入流通过调用read 方法读出源中的数据。
与FileInputStream 类相对应的类是FileOutputStream 类。FileOutputStream 提供了基本的文件写入能力。除了从OutputStream 类继承来的方法以外,
FileOutputStream 类还有两个常用的构造方法,这两个构造方法:
FileOutputStream(String name);
FileOutputStream(File file);
2.2.BufferedInputStream 和BufferedOutputStream 类
为了提高读写的效率, FileInputStream 流经常和BufferedInputStream 流配合使用,FileOutputStream 流经常和BufferedOutputStream 流配合使用。
BufferedInputStream 的一个常用的构造方法是:
BufferedInputStream(InputStream in);
FileInputStream in=new FileInputStream(“A.txt”);
BufferedInputStream buffer=new BufferedInputStream(in);
FileOutputStream out=new FileOutputStream(“B.txt”);
BufferedOutputStream buffer=new BufferedOutputStream(out
需要注意的是,写入完毕后,须调用flush 方法将缓存中的数据存入文件。
3.使用字符流读写文件
字节流不能直接操作Unicode 字符,所以Java 提供了字符流,由于汉字在文件中占用2个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就
可以避免这个现象,在Unicode 字符中,一个汉字被看作一个字符。
所有字符输入流类都是Reader(输入流)抽象类的子类,而所有字符输出流都是Writer(输出流) 抽象类的子类。
Reader 类中常用方法:
int read(): 输入流调用该方法从源中读取一个字符,该方法返回一个整数(0~65535 之间的一个整数,Unicode 字符值),如果未读出字符就返回-1。
int read(char b[]): 输入流调用该方法从源中读取b.length 个字符到字符数组b 中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。
int read(char b[], int off, int len): 输入流调用该方法从源中读取len 个字符并存放到字符数组b 中,返回实际读取的字符数目。
如果到达文件的末尾,则返回-1。其中,off 参数指定read 方法从符数组b 中的什么地方存放数据。
void close(): 输入流调用该方法关闭输入流。
long skip(long numBytes): 输入流调用该方法跳过numBytes 个字符,并返回实际跳过的字符数目。
Writer 类中 常用方法:
void write(int n): 向输入流写入一个字符。
void write(char b[]): 向输入流写入一个字符数组。
void write(char b[],int off,int length): 从给定字符数组 中起始于偏移量off 处取len 个字符写到输出流。
void close(): 关闭输出流。
3.1 FileReader 和 FileWriter 类
FileReader 该类是从Reader 中派生出来的简单输入类。该类的所有方法都是从Reader 类继承来的
两个构造方法:
FileReader(String name);
FileReader (File file) ;
与 FileReader 类相对应的类是FileWriter 类。FileWriter 提供了基本的文件写入能力。除了从FileWriter 类继承来的方法以外,FileWriter
类还有两个常用的构造方法
FileWriter(String name);
FileWriter (File file);
3.2 BufferedReader 和BufferedWriter 类
为了提高读写的效率,FileReader 流经常和BufferedReader 流配合使用;FileWriter 流经常和BufferedWriter 流配合使用。
BufferedReader 流还可以使用方法String readLine()读取一行;
BufferedWriter 流还可以使用方法void write(String s,intoff,int length)将字符串s 的一部分写入文件,
使用newLine()向文件写入一个行分隔符。
4 回压字符流
称PushbackReader 类创建的对象为回压字符流。回压流可以使用unread(char ch)将一个字符回压到该流中,被回压的字符是该回压流
紧接着再调用read()方法时最先读出的字符。回压流可以用来监视读出的信息,当读出一个不需要的信息时,可以不处理该信息,而将需
要的信息回压,然后再读出回压的信息。
PushbackReader(Reader in);
5 数据流
DataInputStream 类和DataOutputStream 类创建的对象被称为数据输入流和数据输出流。这两个流是很有用的两个流,它们允许程
序按着机器无关的风格读取Java 原始数据。也就是说,当我们读取一个数值时,不必再关心这个数值应当是多少个字节。
DataInputStream 类和DataOutputStream 的构造方法:
DataInputStream(InputStream in):将创建的数据输入流指向一个由参数in 指定的输入流
DataOutputStream(OutnputStream out):将创建的数据输出流指向一个由参数out 指定的输出流
6 对象流
ObjectInputStream 类和ObjectOutputStream 类分别是DataInputStream 类和DataOutputStream 类的子类。ObjectInputStream
类和ObjectOutputStream 类创建的对象被称为对象输入流和对象输出流。对象输出流使用writeObject(Object obj)方法将一个对象obj 写入
到一个文件,对象输入流使用readObject()读取一个对象到程序中。
ObjectInputStream 类和ObjectOutputStream 类的构造方法分别是:
ObjectInputStream(InputStream in);
ObjectOutputStream(OutputStream out);
7 RandomAccessFile 类
RandomAccessFile 类创建的流与前面的输入、输出流不同,RandomAccessFile 类既不是输入流类InputStream 类的子类,也不
是输出流类OutputStram 类的子类流。
RandomAccessFile 流的指向既可以作为源也可以作为目的地,换句话说,当我们想对一个文件进行读写操作时, 我们可以创建一个指向该文件的
RandomAccessFile 流即可,这样我们既可以从这个流中读取这个文件的数据,也通过这个流写入数据给这个文件。
RandomAccessFile 类的两个构造方法:
RandomAccessFile(String name,String mode):参数name 用来确定一个文件名,给出创建的流的源(也是流目的地),
参数mode取“r”(只读)或“rw”(可读写),决定创建的流对文件的访问权利。
RandomAccessFile(File file,String mode): 参数file 是一个File 对象,给出创建的流的源(也是流目的地),
参数mode 取“r”(只读)或“rw”(可读写),决定创建的流对文件的访问权利。
8 文件上传
客户通过一个JSP 页面,上传文件给服务器时,该JSP 页面必须含有File 类型的表单,并且表单必须将ENCTYPE 的属性值设成
“multipart/form-data”,
JSP 引擎可以让内置对象request 调用方法getInputStream()获得一个输入流,通过这个输入流读入客户上传的全部信息,包括文件的内容以及表单域的信息。
9 文件下载
JSP 内置对象response 调用方法getOutputStream()可以获取一个指向客户的输出流,服务器将文件写入这个流,客户就可以下载这个文件了