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()可以獲取一個指向客戶的輸出流,服務器將文件寫入這個流,客戶就可以下載這個文件了