使用RandomAccessFile這個類,從檔案中讀取資料,卻讀取不出來
阿新 • • 發佈:2019-01-10
請看下面這段程式碼,相關的問題我應經註釋了出來:
可以看到,上述程式碼中,我用的是txt格式的文件來記錄資料。但是以前寫這段程式碼的時候,因為單元測試不通過,檔案中有亂碼,我就想是不是編碼格式的問題。所以就將這個檔案另存為UTF-8這種格式的檔案。覆蓋了以前的那個。注意,現在如果不刪除這個檔案的話,這個檔案內的所有內容都是UTF-8編碼方式來編碼的,但是在解析時用的是別的編碼方式,似乎是GB2312。所以這樣就會造成上述程式碼中讀不出來資料的現象。但是當我將readUTF換成readDouble,相應的別的內容也換一下的話,它還是能讀出資料的。這就比較怪異了。將這份文件刪掉,再用程式碼重新建立一個,就能解決讀不出來資料的問題了。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; } }