JSP學習筆記(7)-JSP的文件操作

来源:http://www.cnblogs.com/pinnsvin/archive/2016/05/29/5539008.html
-Advertisement-
Play Games

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>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 設計模式(Design Patterns) ——可復用面向對象軟體的基礎 設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的, ...
  • 下麵的是學C++時要註意的。 1.把C++當成一門新的語言學習(和C沒啥關係!真的。); 2.看《Thinking In C++》,不要看《C++變成死相》; 3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因為他們 ...
  • 字典其實和之前的元祖和列表功能相似,都是用來儲存一系列對象的。也就是一種可變容器,或者是我所比喻的革新派的菜單。 但也不是完全相同,我在之前曾經將字典稱為特殊的'序列',是字典擁有序列的部分特性,但是又不符合序列的定義。 首先我們來看下字典是如何創建的: 我們可以使用{} 或者dict() 來創建一 ...
  • 實例與上一篇GlassFish一致,應用伺服器換成wildfiy主要介紹差異部分。 1.準備工作,下載wildfly 10.0.0.final 2.創建管理員和用戶, 解壓縮wildfly-10.0.0.Final,在解壓後的文件夾中wildfly-10.0.0.Final\bin 下運行add-u ...
  • 這篇文章簡單實現在Java EE7 下實現遠程客戶端訪問Java EE伺服器EJB的功能 準備工作: 創建Enterprise Application 服務->伺服器右鍵添加服務伺服器->選擇GlassFish Server->安裝位置選擇java_ee_sdk解壓縮目錄下glassfish4文件夾 ...
  • set數據類型 先用一行代碼來說明一下 下麵的代碼的運行結果 通過代碼的結果可以看出 set是一個是一個無序且不重覆的元素集合 創建set 集合和字典相同{} 只有通過內部的元素才能體現出區別 創建空set集合,最好使用set()的方法創建,然後通過add方法添加元素 以下是set集合的一些常用方法 ...
  • 直接上代碼: 配置下過濾器就行了,效果如下: 在開發階段還是比較有用的。 ...
  • 單向鏈表每個節點由兩個成員組成:一個是數據域,一個是指向自身結構的指針類型成員。如: struct slist { int data; struct slist *next; }; typedef struct slist SLIST; 單向鏈表的基本演算法包括:鏈表的建立、節點數據域的輸出、節點的插 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...