JAVA IO操作目标
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484669GRP5.png"></a>
本季知識點
1、File類
2、RandomAccessFile類
File類
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484672u2TO.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_12354846769Pd6.png"></a>
在JAVA中所有的IO操作全部存放在java.io包中。
File是唯一一個與檔案本身有關的操作。
在使用File類的構造方法處必須加入一個完整的路徑。
要求一:可以在F盤上建立一個新的檔案:demo.txt檔案。
public boolean createNewFile() throws IOException
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484684WZLV.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484689jJeA.png"></a>
看下效果:
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_123548469135Xv.png"></a>
我們發現系統提示非法轉義字元,在前面學習正則時“\”表示轉義,我們需要輸入兩個“\\”即“f:\\demo.txt”
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484694yTPE.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484697EMfC.png"></a>
需要進行try/catch處理
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484700Rw20.png"></a>
現在發現檔案出來了哈~
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484704aMNt.png"></a>
如果現在再想建立同一個檔案,我們會發現顯示false,因為檔案已經存在,不能再建立同一檔案哈~
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484706RVqs.png"></a>
能否删除掉demo.txt的檔案呢?
public boolean delete()
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484708bBKw.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484711H4j7.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484713MeQO.png"></a>
要求:
如果檔案存在則删除掉檔案,如果檔案不存在,則建立檔案。
判斷檔案是否存在:public boolean exists()
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484717Ogit.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484722Pqsb.png"></a>
注意點:
如果程式按以上格式寫的話,則會有一個限制:
· windows:\
· linux:/
File類中提供了幾分割符
public static final String separator
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484726NF4i.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484731n04H.png"></a>
public String getPath()
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484734WTiw.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484738DFdv.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484742G33H.png"></a>
判斷給定的路徑是否是一個目錄:public boolean isDirectory()
顯示f:\demo.txt不是目錄哈~
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484749TNyl.png"></a>
再來看一個:
顯示F:\TL-WN310G& TL-WN350G是目錄哈~
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484753WnO1.png"></a>
通過這個方法可以判斷給定的路徑是否是目錄哈~
要求可以列出指定目錄下的全部檔案。
· 傳回完整路徑:public String[] list() ;
· 傳回全部的File對象:public File listFiles() ;
1、使用字元串數組操作
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484755wM8n.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484758Bzl6.png"></a>
可以正常列出F:\資料目錄下的檔案和目錄哈~
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_12354847626al7.png"></a>
2、使用File類對象數組
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_12354847661Upn.png"></a>
使用File類可以開出路徑哈~
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484775CsV9.png"></a>
思考題:
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_12354847881ahQ.png"></a>
不斷的判斷給定的路徑是否是目錄,如果是目錄,則繼續向下列出,此種題目隻能使用遞歸操作完成。
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484791KkgE.png"></a>
注意:遞歸操作可能會導緻記憶體洩漏問題~~~
輸入輸出方法
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_123548480301VE.png"></a>
讀寫過程
RandomAccessFile
假設一個檔案中存放了三組資料:
AA 80
BB 90
CC 99
RandomAccessFile類
public RandomAccessFile(File file, String mode) throws FileNotFoundException
public RandomAccessFile(File file, --> File 類的執行個體化對象
String mode) --> 模式
throws FileNotFoundException
模式現在主要用兩種:
· r:隻讀
· w:隻寫
· rw:讀寫 --> 如果沒有檔案,寫時,會自動建立。
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484820A46n.png"></a>
public final void writeBytes(String s) throws IOException
public final void writeInt(int v) throws IOException
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_12354848259b1M.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484828n10D.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484830nkCJ.png"></a>
現在我們可以寫入資料了,下面我們将其讀出來哈~
實際上讀的時候隻能按byte讀出,byte隻能一個一個的往外讀。
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484833uoQl.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484836851k.png"></a>
如果讀完第一個人的資料,則此時指針在第二個人之前,如果繼續往下讀則會讀取第二個人的資料,我們測試一下哈~~
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484839q71N.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484843PJXD.png"></a>
如果我們想不讀取第一個人的資料,直接讀取第二個人的資料,看下面哈~~
public final byte readByte() throws IOException
public int skipBytes(int n) throws IOException
public void seek(long pos) throws IOException
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484846stG8.png"></a>
看下效果,直接讀取第二個人資料了哈~
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484849Z0aD.png"></a>
如果要讀取第三個人資料就是跳過16個位元組哈~raf1.skipBytes(16);
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_12354848528Tux.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484855mwJD.png"></a>
現在我們是一直往下讀哈,我們要使指針往回讀取資料呢?
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484858vrcG.png"></a>
<a href="http://redking.blog.51cto.com/attachment/200902/24/27212_1235484860bhcx.png"></a>
雖然此類可以比較靈活的實作讀寫操作,可是也是有缺點的,因為必須知道的其跳的長度。
真正開發中使用的資料讀取類:InputStream、OutputStream、Reader、Writer,下季再見分曉哈~~~~
##############################################################
本文轉自redking51CTO部落格,原文連結:http://blog.51cto.com/redking/132835,如需轉載請自行聯系原作者