请看下面这段代码,相关的问题我应经注释了出来:
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,相应的别的内容也换一下的话,它还是能读出数据的。这就比较怪异了。将这份文档删掉,再用代码重新创建一个,就能解决读不出来数据的问题了。