Welcome to Yumao′s Blog.
Java SE 2 Day01
====================
Java IO (Input/Output)
文件系統的管理 (pwd ls rm mv mkdir)
文件內容存取(訪問) Access,
RamdomAccessFile
流式訪問
可擴展的流
ls /etc|grep ^pa
1 Java java.io.File 文件系統管理 (pwd ls mkdir rm )
1) File類的用途: 用於表示文件(目錄);只用於表示文件(目錄)
的信息(名稱,大小等)不能對文件的內容進行訪問
File 代表文件系統中對文件/目錄的管理操作(增刪改查, CRUD)
2) java.io.File基本API
任務: A 檢查當前文件夾中是否包含目錄 demo
B 如果沒有demo, 就創建文件夾demo
C 在demo 中 創建文件 test.txt
D 顯示demo 文件夾的內容.
E 顯示test.txt 的絕對路徑名
F 顯示test.txt 的文件長度和創建時間
File(String)
long length()
long lastModified()
String getName()
String getPath()
boolean exists()
boolean dir.isFile()
boolean dir.isDirectory()
boolean mkdir()
boolean mkdirs()
boolean delete();
boolean createNewFile() throw IOException
File[] listFile()
3) 回調模式和FileFilter (ls|grep patten)
File[] listFile(FileFilter)
A 任務: 列出 src/corejava/day07 中的.java文件
2 RandomAccessFile 操作文件內容, 訪問文件任意位置
16進制:41 對應: 0100 0001 是一個字節(byte)
一個MP3歌曲大約 5M byte, 一個5M個Byte數據組成的有序集合
一個文件8G個Byte
文件是byte by byte 是數據有序集合
基本的文件訪問, 基於一個byte一個byte的讀寫文件
byte數據是文件的基本組成單位, 是最小的原子單位.
1)Java 文件模型, 文件是byte by byte 是數據集合
data : 41 42 00 00 00 ff d6 d0 ...
index : 0 1 2 3 4 5 6 7 8
pointer: ^
2) 打開文件, 有兩種模式 "rw", "r"
RandomAccessFile raf = new RandomAccessFile(file, "rw");
打開文件時候默認文件指針在開頭 pointer=0
3)寫入方法: raf.write(int) 將整數的"低八位"寫入到文件中, 指針
自動移動到下一個位置, 準備再次寫入
* 文件名的擴展名要明確指定, 沒有默認擴展名現象!
任務: A 在demo文件夾中創建raf.dat
B 打開這個文件
C 寫入 'A' 和 'B'
D 寫入整數 255 佔用4個byte
E 寫入GBK 編碼的 '中', d6d0
File demo = new File("demo");
if(!demo.exists()){
demo.mkdir();
}
File file = new File(demo, "raf.dat");
if(! file.exists()){
file.createNewFile();
}
RandomAccessFile raf =
new RandomAccessFile(file,"rw");
System.out.println(raf.getFilePointer()); //0
raf.write('A');// 0041 -> 00000041 -> 41
System.out.println(raf.getFilePointer());//1
raf.write('B');
int i = 0x7fffffff;// 7f ff ff ff
//raf.write(i>>>24);// i>>>24 00 00 00 7f
//raf.write(i>>>16);// i>>>16 00 00 7f ff
//raf.write(i>>>8);// i>>>8 00 7f ff ff
//raf.write(i);// i 7f ff ff ff
raf.writeInt(i);
String s = "中";//4e2d
byte[] gbk = s.getBytes("gbk");
//gbk = {d6, d0}
raf.write(gbk);
raf.close();
4) 讀取文件
int b = raf.read() 從文件中讀取一個byte(8位) 填充到int
的低八位, 高24位為0, 返回值範圍正數: 0~255, 如果返回-1表示
讀取到了文件末尾! 每次讀取後自動移動文件指針, 準備下次讀取.
任務1: A 只讀打開文件, 移動到int數據位置
B 連續讀取4個byte, 拼接為int (反序列化)
RandomAccessFile raf =
new RandomAccessFile("demo/raf.dat", "r");
int i = 0;
raf.seek(2);//移動到int位置
i = raf.readInt();
System.out.println(Integer.toHexString(i));
raf.close();
5) 文件讀寫完成以後一定關閉文件
RandomAccessFile 可以讀寫文件, 文件最基本的讀寫: read(), write()
每次讀寫一個byte, 其他的方法(readInt()等)都是基於這兩個方法實現的.
文件的最基本訪問方式就是 byte by byte
RandomAccessFile 提供基本類型的序列化方法, 和反序列化方法
基本類型序列化方法 : writeInt() writeLong() writeDouble()...
基本類型反序列化方法:readInt() readLong() readDouble().
讀取一個文件的前提: 是對這個文件有足夠清晰的了解!了解到每個byte
3 序列化與基本類型序列化
int -> 4 byte
long -> 8 byte
序列化: 將數據轉換為 n個byte序列叫序列化: 數據 -> n byte
如: 0x7fffffff -> [ 7f ff ff ff ]
反序列化: 將n byte 轉換為一個數據的過程 : n byte -> 數據
如: [ 7f ff ff ff ] -> 0x7fffffff
RandomAccessFile 提供 基本類型 的讀寫方法
可以將基本類型序列化到文件 和 反序列化為數據
4 IO流 (InputStream, OutputStream)
InputStream, OutputStream 都是抽象類
InputStream 抽象了應用程序讀取數據的方式
OutputStream 抽象類應用程序寫出數據的方式
EOF = End of File = -1
輸入流基本方法:
int b = in.read() 讀取一個byte 無符號填充到int低八位,-1是EOF
in.read(byte[] buf) 讀取數據填充到buf中
in.read(byte[] buf, int start, int size)讀取數據填充到buf中
in.skip(long n)
in.close();
輸出流的基本方法:
out.write(int b) 寫出一個byte到流 b的低八位寫出
out.write(byte[] buf) 將緩衝區buf都寫入到流
out.write(byte[] buf, int start, int size)將buf的一部分
寫到流中.
out.flush() 清理緩衝
out.close();
InputStream OutputStream
文件(Byte 序列) --輸入流--> 應用程序 --輸出流--> 文件(Byte)
in.read() out.write()
5 文件輸入流 FileInputStream 繼承了InputStream
FileInputStream 具體實現了在文件上讀取數據
任務1: 讀取文件並且按照HEX輸出, 每10 byte為一行
任務2: 讀取文件內容為一個byte數組
任務3: 將byte數組內容按照HEX輸出, 每10 byte為一行
任務4: 將byte數組轉換為hex字符串
6 文件輸出流 FileOutputStream 繼承了OutputStream
FileOutputStream 實現了向文件中寫出byte數據的方法
任務: A 在demo文件夾中創建out.dat
B 打開這個文件
C 寫入 'A' 和 'B'
D 寫入整數 255 佔用4個byte
E 寫入GBK 編碼的 '中', d6d0
9 文件複製實現與優化
InputStream OutputStream
文件(Byte 序列) --輸入流--> 應用程序 --輸出流--> 文件(Byte)
in.read() out.write()
作業
1 複習並且實現全部課題演示代碼
2 實現IOUtils中全部的方法
3 實現IOUtils中擴展的方法
預習:
1 Java 對象序列化
2 Java 線程