1. 程式人生 > >JAVA高階視訊_IO輸入與輸出_RandomAccessFile類_筆記

JAVA高階視訊_IO輸入與輸出_RandomAccessFile類_筆記

概念:

1.RandomAccessFile類 提供了 眾多(最多)的 檔案 訪問 方法;

2.RandomAccessFile類 支援 “隨機訪問” 方式;//不好畫圖,類似於vectoriterator方式或者陣列指標方式。指示器大概就跟迭代器一樣吧……

3.RandomAccessFlie類 在隨機讀寫 等長記錄格式的 檔案 時 有優勢;//聽了這一段的說明覺得指示器就是迭代器……記錄格式:內容有規律可循的格式。

4.RandomAccessFile類 僅限於 操作檔案,不能 訪問 其他的 IO裝置,如網路、記憶體映像 等;

5.兩種構造方式

new RandomAccessFile(f, "rw"); //read & write

new RandomAccessFile(f, "r"); //read only

//C++採用流方式讀寫檔案和設定檔案讀寫狀態,跟這個稍微有點不一樣。

2.程式設計例項:往檔案中寫入三名員工的資訊,每個員工含有 姓名 和 年齡 兩個欄位(欄位……資料庫?),然後按照第二名,第一名,第三名的先後順序讀出員工資訊。(要保證姓名的長度相同。年齡只要是整型數就不要擔心長度,都是4位元組)

/*

 *Employee.java

 */

public class Employee {

public String name = "";//這裡的成員變數竟然是public的讓我很不習慣……

public int age = 0;

public static final int LEN = 8;

/**

* Method Employee

*

*

* @param name

* @param age

*

*/

public Employee(String name, int age) {

// TODO: Add your code here

if(name.length() > LEN){//如果比規定長度長

name = name.substring(0, LEN);//用substring()方法擷取規定長度的字串

} else {//如果比規定長度短

while(name.length() < LEN){

name += "/u0000";//用一個空字元(空格?)填充,迴圈至滿足長度

}

}

this.name = name;//經過上述處理後,給物件賦標準的值

this.age = age;

}

}

/*  *RandomFileTest.java  */ import java.io.*; public class RandomFileTest { /** * Method main * * * @param args * */ public static void main(String[] args) throws Exception { // TODO: Add your code here /* *招了e1,e2,e3三個員工 */ Employee e1 = new Employee ("張三", 23); Employee e2 = new Employee ("lisi", 258); Employee e3 = new Employee ("wangwu", 25); /* *把人家的名字和年紀(rw == 用鉛筆)記到本子上 */ RandomAccessFile ra = new RandomAccessFile("employee.txt", "rw");//初始化為read & write //write方法是在ra物件裡寫入 ra.writeChars (e1.name);//這個函式是把字串轉為字元陣列;string.h的封裝也許更嚴密些 //writeChars方法,把字串直接轉為一個一個字元 ra.writeInt (e1.age); ra.writeChars (e2.name); ra.writeInt (e2.age); ra.writeChars (e3.name); ra.writeInt (e3.age); ra.close();//關閉檔案,好習慣好未來 //int len = 0;//記錄字元陣列的長度? //byte[] buf = new byte[Employee.LEN];//字元陣列型別是byte[]……八個字元長的陣列 String strName = "";//此字串初始化為空 RandomAccessFile raf = new RandomAccessFile("employee.txt", "r");//初始化為read only raf.skipBytes (Employee.LEN * 2 + 4);//跳過名字長度加int長度個字元 //len = raf.read (buf);//len被賦值為.read方法所讀字元的數量,read方法是在raf物件裡讀。 //strName = new String (buf, 0, len);//把字元陣列轉回去……字串…… for(int i = 0; i < Employee.LEN; i++) { strName += raf.readChar(); } System.out.println (strName.trim() + ":" + raf.readInt());//這個純read是往後讀一個位元組,就是讀在那個位置的年齡 raf.seek (0);//絕對定位,字元位置 //len = raf.read (buf); //strName = new String (buf, 0, len); strName = ""; for(int i = 0; i < Employee.LEN; i++) { strName += raf.readChar(); } System.out.println (strName.trim() + ":" + raf.readInt());//去掉不可見的字元 raf.skipBytes (Employee.LEN * 2 + 4); //len = raf.read (buf); //strName = new String (buf, 0, len); strName = ""; for(int i = 0; i < Employee.LEN; i++) { strName += raf.readChar(); } System.out.println (strName.trim() + ":" + raf.readInt()); raf.close();//關閉檔案,好習慣好未來 } } /*  *這個程式加上我的註釋已經改的亂七八糟了,我個內牛滿面啊,以後讀的時候得多費心了。  */ 3.零星 (1)最終在JCreator中和文字中顯示都不理想,還是CMD看得真切,自己估計還是Unicode標準與ASC標準之間的矛盾。 (2)寬字元和ASC標準之間的矛盾出現了,當名字是漢字的時候,由於位元組數量翻倍,導致長度變化,指示器錯位,然後年齡顯示就完全不正常了。具體解決方法找writeChar和readChar。 (3)還是不正常,據說是因為使用寬字元,skipBytes又是讀的是按一個位元組來算的,所以LEN要乘以2. (4)依舊不正常,strName變數不能初始化為null,否則會出現異常,必須初始化為空字串。而且每次寫之前都要賦值為空字串,不然這一次的結果是連在上一次的結果上的。