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之间的一个整数),如未读出字节就返回-1int read(byte b[])读取b.length个字节到字节数组b中,返回实际读取的字节数目,如到达文件的末尾,返回-1int 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>