CoreJava學習7——IO之文件操作

包含了以下類和接口:

File類

FileFilter接口

RandomAccessFile類


一、File類


java.io.File用於表示文件(目錄),也就是說程序員可以通過File類在程序中操作硬盤上的文件和目錄。


File類只用於表示文件或目錄的信息(名稱,大小等),不能對文件的內容進行訪問。


構造方法摘要:


File(File parent, String child)

根據 parent 抽象路徑名和 child 路徑名字符串創建一個新 File 實例。

File(String pathname)

通過將給定路徑名字符串轉換爲抽象路徑名來創建一個新 File 實例。

File(String parent, String child)

根據 parent 路徑名字符串和 child 路徑名字符串創建一個新 File 實例。

File(URI uri)

通過將給定的 file: URI 轉換爲一個抽象路徑名來創建一個新的 File 實例。

/**
* "."代表當前目錄,當前類所屬項目的根目錄
*
* File.separator是一個常量,用於描述不同文件系統中目錄層級分割符的。 *Linux 是 / windows 是 \
*
*/
File file = newFile("."+File.separator+"file.txt");//不推薦使用"./file.txt"由於跨平臺的關係
/**
* 查看文件或目錄相關的內容
*/
//判斷文件或者目錄是否存在
System.out.println(file.exists());
if(!file.exists()){
    //文件不存在創建
    file.createNewFile();
}
/** 獲取文件名*/
System.out.println("文件名:"+file.getName());
/** 獲取文件大小*/
System.out.println("文件大小:"+file.length());
/** 文件相對路徑*/
System.out.println("文件路徑:"+file.getPath());
//文件路徑:./file.txt
/** 文件絕對路徑*/
System.out.println("文件絕對路徑:"+file.getAbsolutePath());
//文件絕對路徑:/home/soft01/workSpace/JSD1305_JavaSE/./file.txt
/** 文件系統中描述的路徑 去除了有相對路徑的 ./ 這樣的字符*/
System.out.println("文件系統中描述的路徑:"+file.getCanonicalPath());
/** 是文件還是目錄*/
System.out.println("是否是文件:"+file.isFile());
System.out.println("是否是目錄:"+file.isDirectory());
/** 查看當前文件最後修改日期 */
longtime = file.lastModified();
Date date = newDate(time);
SimpleDateFormat format = newSimpleDateFormat("yy-MM-dd hh:mm:ss");
System.out.println("文件最後修改日期:"+format.format(date));
/** 是否可讀可寫 可執行文件*/
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.canExecute());
/**
* 創建/刪除 文件或目錄
* createNewFile() 當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創建一個新的空文件。
* mkdir() 創建此抽象路徑名指定的目錄。
* mkdirs() 創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。
* delete() 刪除此抽象路徑名錶示的文件或目錄。
* deleteOnExit() 在虛擬機終止時,請求刪除此抽象路徑名錶示的文件或目錄。
*/
File dir = newFile("demo/demo1");//在根目錄下不用 "."
if(!dir.exists()) {
    dir.mkdirs();
}
System.out.println(dir.getCanonicalPath());
// /home/soft01/workSpace/JSD1305_JavaSE/demo/demo1
if(dir.exists()){
dir.delete();//確保目錄是空的
}
/**
* 查看目錄內容
* String[] list() 返回一個字符串數組,這些字符串指定此抽象路徑名錶示的目錄中的文件和目錄。
* String[] list(FilenameFilter filter) 返回一個字符串數組,這些字符串指定此抽象路徑名
* 表示的目錄中滿足指定過濾器的文件和目錄。
* File[] listFiles() 返回一個抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示的目錄中的文件。
* File[] listFiles(FileFilter filter) 返回抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示
* 的目錄中滿足指定過濾器的文件和目錄。
* File[] listFiles(FilenameFilter filter)返回抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示
* 的目錄中滿足指定過濾器的文件和目錄。
* static File[] listRoots() 列出可用的文件系統根。
*/
/** 列出當前根目錄下的目錄或文件*/
File f = newFile(".");
String[] dirs = f.list();
for(inti = 0; i < dirs.length; i++)
System.out.println(dirs[i]);


二、FileFilter接口


是一個接口,裏面必須實現一個抽象方法accept用來定義過濾文件的規則。


此接口的實例可以傳遞給File類的listFilter(FileFilter)方法。


File[] listFiles(FileFilter filter) 返回抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示的目錄中滿足指定過濾器的文件和目錄。


FileFilter filter = newFileFilter() {
    @Override
    publicbooleanaccept(File file) {
        //過濾器之獲取文件 是文件,並且是以txt結尾的文件
        booleanbf = file.isFile()&&file.getName().lastIndexOf(".txt")!=-1;
        returnbf;
    }
};
File file = newFile("./");
File[] subs = file.listFiles(filter);
for(File sub : subs) {
    System.out.println(sub.getName());
}


這種通過調用某個方法並傳入一個實例,在該方法中又調用我們傳入的實例的某個方法的模式稱爲[回掉模式]。


swing中使用的監聽器 也是典型的回掉模式。


三、RandomAccessFile類

文件在硬盤上都是以byte by byte 存儲的。是數據的集合。

打開文件:

有兩種模式:“rw(讀寫)”和“r(只讀)”

RandomAccessFile raf = new RandomAccessFile();

打開文件時候默認文件指針在開頭pointer=0

寫入方法:

raf.write(int) 可以將整數的“低八位”寫入到文件中,同時指針自動移動到下一個位置,準備再次寫入。

讀取文件:

int b=raf.read()從文件中讀取一個byte(8位)填充到int的低八位,高24位爲0,返回值範圍正數0~255,如果返回-1表示讀取到了文件末尾,每此讀取後自動移動文件指針,準備下一次讀取。


讀寫文件完畢後一定要關閉文件。


RandomAccessFile 當文件不存在時候,會自動創建文件。


File file = newFile("file.txt");
    if(!file.exists()){
    file.createNewFile();
}
/** 以讀寫的形式打開文件 */
RandomAccessFile raf = newRandomAccessFile(file,"rw");
/**向文件中寫數據
* 調用 write(int d)方法
* 只寫一個字節 低8位
*/
raf.write('A');
raf.write('B');
intmax = 0x7fffff;
/**
* 因爲write(int b)方法只能一次寫入一個字節
* 所以要將一個int值寫入文件,需要連續寫4次。
*
* int 最大的二進制
* 01111111 11111111 11111111 11111111
*
* 要把高八位移到低八位來存儲,用移位操作,移動24位
* int>>>24
* 00000000 00000000 00000000 01111111 第一次
* int>>>16
* 00000000 00000000 01111111 11111111 第二次
* int>>>8
* 00000000 01111111 11111111 11111111 三次
* 最後一次移動0位就相當於不移動
*/
raf.write(max>>>24);//00 00 00 7f
raf.write(max>>>16);//00 00 7f ff
raf.write(max>>>8); //00 7f ff ff
raf.write(max); //7f ff ff ff
/** JDK提供了基於基本類型的寫入方法,其內部也是通過移位來實現的。
* 如:writeInt(int v) writeLong(long v)
*/
raf.writeInt(max);
/** write(byte[] data) */
String info = "你好Java!";
raf.write(info.getBytes("gbk"));
System.out.println(raf.length());//輸出有多少字節
raf.close();

1、基於緩存的寫方法


write(byte[] b) 將 b.length 個字節從指定 byte 數組寫入到此文件,並從當前文件指針開始。

write(byte[] b, int off, int len) 將 len 個字節從指定 byte 數組寫入到此文件,並從偏移量 off 處開始。


2、基於緩存讀取方法


int read():一次讀取一個字節,返回存放的是讀取到一個字節,若到了文件末尾返回爲-1。


EOF:end of file


int read(byte[] b)將最多 b.length 個數據字節從此文件讀入 byte 數組。

int read(byte[] b, int off, int len)將最多 len 個數據字節從此文件讀入 byte 數組。


File file = newFile("file.txt");
/** 以讀寫的形式打開文件 */
RandomAccessFile raf = newRandomAccessFile(file,"rw");
inta = raf.read();
System.out.println(a);//讀取的是-1,說明到文件末尾。說明文件中沒有內容
/** 指針位置*/
System.out.println("指針位置:"+raf.getFilePointer());
/**
* 原因:
* RandomAccessFile是根據遊標進行讀寫操作的。
* 要將遊標移動到文件開始位置,才能重新開始讀取文件內容。
*
* 移動遊標的方法:seek(int index)
* 移動到指定位置,0代表文件開始的第一個字節。
*/
raf.seek(0);
System.out.println("指針位置:"+raf.getFilePointer());
a = raf.read();
System.out.println((char)a);
raf.close();


3、隨機讀寫方法


seek(long pos) 設置到此文件開頭測量到的文件指針偏移量,在該位置發生下一個讀取或寫入操作。

int skipBytes(int n) 嘗試跳過輸入的 n 個字節以丟棄跳過的字節。


File file = newFile("f.txt");
if(!file.exists()){
    file.createNewFile();
}
/** 以讀寫的形式打開文件 */
RandomAccessFile raf = newRandomAccessFile(file,"rw");
raf.write("我愛Java,I Love Java,路慢慢。".getBytes("GBK"));
//讀取
byte[] s = newbyte[31];
/** int read(byte[] array)
* 將最多 array.length 個數據字節從此文件讀入 byte 數組。
* 返回是實際讀取到的字節數,
*/
raf.seek(0);
//raf.skipBytes(4);//試跳過輸入的 n 個字節以丟棄跳過的字節。
inta = raf.read(s);
System.out.println("讀取到的字節是:"+a);
System.out.println(newString(s,"GBK"));//我愛Java,I Love Java,路慢慢。
raf.close();

4、字符串的讀寫


String readUTF() 從此文件讀取一個字符串。

void writeUTF(String str) 使用 UTF-8編碼以與機器無關的方式將一個字符串寫入該文件。

File file = newFile("file.txt");
if(file.exists()){
    file.delete();
}
file.createNewFile();
RandomAccessFile raf = newRandomAccessFile(file, "rw");
/**
* 寫 char 值 應該寫2個字節
*/
chara = '中';
raf.writeChar(a);
//raf.writeChars("國人");//還可以直接些字符串
//這裏不推薦這樣,因爲和編碼有關係,我們應該同一編碼。
/**
* 因爲UTF-8是世界通用的編碼格式
* RandomAccessFile提供了使用該編碼格式讀寫字符串的方法。
* void writeUTF(String str)
* String readUTF()
*/
raf.writeUTF("國人,呵呵呵呵!!!!");
raf.seek(2);//把指針放到起始位置
System.out.println(raf.readUTF());
//國人,呵呵呵呵!!!!
raf.close();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章