1. 程式人生 > >檔案使用迭代器設計模式進行讀取

檔案使用迭代器設計模式進行讀取

背景:由於檔案很大,一次載入到記憶體很耗費記憶體的空間,因此可以使用迭代器設計模式進行設計,一次讀取一行,載入到記憶體。

package iterator;

public class FileReadWriterTest {

public static void main(String[] args) {

for(int i=0;i<10;i++){

FileUtils.writeFile("/Desktop/aa", "2010-12-12 23:59:59,0x12ed345,yy,15535250726", "UTF-8");

}

FileRecordIterator iterator=new

FileRecordIterator("/Users/yy/Desktop/aa","UTF-8");

while(iterator.hasNext()){

RecordModel recordModel=iterator.next();

if(recordModel!=null){

System.out.println(recordModel);

}

}   

}

}

package iterator;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class FileUtils {
    /**
     * 想指定的檔案可以追加的寫資料
     * @param fileName
     * @param content
     * @param characterCoding
     */
    public static void writeFile(String fileName,String content,String characterCoding){
        BufferedWriter bw=null;
        try {
             bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName,true),characterCoding));
             bw.write(content);
             bw.newLine();
             bw.flush();
        } catch (Exception e) {
        } finally{
            if(bw!=null){
                IOUtils.close(bw);
            }
        }
    }
}

package iterator;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Iterator;


import org.apache.commons.io.IOUtils;


public class FileRecordIterator implements Iterator<RecordModel> {


    private boolean        hasNext;
    private BufferedReader bufferedReader;


    public FileRecordIterator(String fileName, String charactorEncoding) {
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(
                new FileInputStream(fileName), charactorEncoding));
            hasNext = true;
        } catch (Exception e) {
            hasNext = false;
        }
    }


    /** 
     * @see java.util.Iterator#hasNext()
     */
    @Override
    public boolean hasNext() {
        return hasNext;
    }


    /** 
     * @see java.util.Iterator#next()
     */
    @Override
    public RecordModel next() {
        RecordModel recordModel=null;
        try {
            String line = bufferedReader.readLine();
            while (line != null) {
                if (line.split(",").length==4) {
                    recordModel=new RecordModel();
                    String[] field=line.split(",");
                    recordModel.setBirthday(field[0]);
                    recordModel.setId(field[1]);
                    recordModel.setUserName(field[2]);
                    recordModel.setPhone(field[3]);
                    break;
                }
            }
        } catch (Exception e) {
        }
        hasNext = recordModel!=null;
        if (!hasNext) {
            IOUtils.closeQuietly(bufferedReader);
        }
        return recordModel;
    }
}

package iterator;

public class RecordModel {

private String birthday;

private String id;

private String userName;

private String phone;

public String getBirthday() {

return birthday;

}

public void setBirthday(String birthday) {

this.birthday = birthday;

}

public String getId() {

return id

;

}

public void setId(String id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

/**

* @see java.lang.Object#toString()

*/

@Override

public String toString() {

return"RecordModel [birthday=" + birthday + ", id=" + id + ", userName=" + userName

+ ", phone=" + phone + "]";

}

}