1.File類 File對象用來獲取文件本身的一些信息,例如文件所在目錄,文件的長度,文件讀寫許可權等,不涉及文件的讀寫操作。 創建一個File對象的構造方法有3個: 使用第一種構造方法創建File對象時,filename是文件名會被認為與當前應用程式在同一個目錄中。 File類常用方法 1.1.創建 ...
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>