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>