Welcome to Yumao′s Blog.
Hello JavaSE2 Day01
, 2012年03月16日 , Java Language , 评论 在〈Hello JavaSE2 Day01〉中留言功能已關閉 ,

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 線程
  

Code Package

课堂提纲教案

关键字:, , , , , ,

评论已关闭