檔案使用迭代器設計模式進行讀取
背景:由於檔案很大,一次載入到記憶體很耗費記憶體的空間,因此可以使用迭代器設計模式進行設計,一次讀取一行,載入到記憶體。
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
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 + "]";
}
}