1. 程式人生 > >使用RandomAccessFile這個類,從檔案中讀取資料,卻讀取不出來

使用RandomAccessFile這個類,從檔案中讀取資料,卻讀取不出來

請看下面這段程式碼,相關的問題我應經註釋了出來:

package timemanager;

import java.io.EOFException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;

public class StoreAndLoad {
	final String fileNameString="E:\\javaSE程式碼\\TimeManager\\data\\data.txt";
	final int CHAR_LENGTH=2;
	File file=new File(fileNameString);
	
	public RandomAccessFile fileStoreData;
	
	final char dataSeparator='\32';
	
	public void writeOneDayIntoFile(String[] parameterStrings){
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				System.out.println("File failed to establish");
			}
		}
		
		try {
			fileStoreData=new RandomAccessFile(file, "rw");
			fileStoreData.seek(fileStoreData.length());
			for (int i = 0; i < parameterStrings.length; i++) {
				fileStoreData.writeUTF(parameterStrings[i]);
				fileStoreData.writeChar(dataSeparator);
			}
		} catch (FileNotFoundException  e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<String> readOneDayFromFile(){
		ArrayList<String> arrayList=new ArrayList<String>();
		try {
			while (true) {
				//System.out.println(fileStoreData.getFilePointer());
				//上面那行語句返回的結果是0,說明下面的語句在讀的時候,不是從檔案末尾讀的。
				arrayList.add(fileStoreData.readUTF());
				fileStoreData.skipBytes(CHAR_LENGTH);
			}
		}catch (EOFException e) {
			if (arrayList.size()==0) {
				System.out.println("arraylist is empty");
			}
			//上面的if語句會得到呼叫,說明確實是從檔案頭讀到了檔案尾
			//怪異的是,arrayList怎麼會沒有資料呢?
			return arrayList;
		} catch (IOException e) {
			e.printStackTrace();
		}
	
		return null;
	}
}

可以看到,上述程式碼中,我用的是txt格式的文件來記錄資料。但是以前寫這段程式碼的時候,因為單元測試不通過,檔案中有亂碼,我就想是不是編碼格式的問題。所以就將這個檔案另存為UTF-8這種格式的檔案。覆蓋了以前的那個。注意,現在如果不刪除這個檔案的話,這個檔案內的所有內容都是UTF-8編碼方式來編碼的,但是在解析時用的是別的編碼方式,似乎是GB2312。所以這樣就會造成上述程式碼中讀不出來資料的現象。但是當我將readUTF換成readDouble,相應的別的內容也換一下的話,它還是能讀出資料的。這就比較怪異了。將這份文件刪掉,再用程式碼重新建立一個,就能解決讀不出來資料的問題了。