package com.meidusa.amoeba.benchmark;
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
import com.meidusa.amoeba.util.Initialisable;
import com.meidusa.amoeba.util.InitialisationException;
import com.meidusa.amoeba.util.StringUtil;
/**
* @author Struct
*
*/
public class FileLineData implements RandomData<Object>,Initialisable{
private File file ;
private RandomAccessFile raf = null;
private String lineSplit;
private boolean needSplit = true;
private boolean closed = false;
public boolean isNeedSplit() {
return needSplit;
}
public void setNeedSplit(boolean needSplit) {
this.needSplit = needSplit;
}
public String getLineSplit() {
return lineSplit;
}
public void setLineSplit(String lineSplit) {
if(StringUtil.isEmpty(lineSplit)){
lineSplit = null;
}else{
this.lineSplit = lineSplit;
}
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
@Override
public void init() throws InitialisationException {
try {
raf = new RandomAccessFile(file,"r");
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
closed = true;
try {
raf.close();
} catch (IOException e) {
}
}
});
} catch (IOException e) {
throw new InitialisationException(e);
}
}
@Override
public synchronized Object nextData() {
if(closed) throw new IllegalStateException("file closed..");
String line = null;
try {
line = raf.readLine();
while(StringUtil.isEmpty(line) && line != null){
line = raf.readLine();
}
if(line == null){
throw new EOFException("end of File="+this.getFile().getAbsolutePath());
}
} catch (IOException e) {
closed = true;
throw new IllegalStateException(e);
}
String[] obj = null;
if(needSplit){
if(lineSplit == null){
obj = StringUtil.split(line);
}else{
obj = StringUtil.split(line,lineSplit);
}
return obj;
}else{
return line;
}
}
public static void main(String[] args) throws Exception{
final FileLineData mapping = new FileLineData();
mapping.setFile(new File("c:/role.txt"));
mapping.init();
List<Thread> list = new ArrayList<Thread>();
long start = System.currentTimeMillis();
for(int j=0;j<1;j++){
Thread thread = new Thread(){
public void run(){
for(int i=0;i<1000;i++){
System.out.println(mapping.nextData());
}
}
};
list.add(thread);
thread.start();
}
for(int i=0;i<list.size();i++){
list.get(i).join();
}
System.out.println("time="+(System.currentTimeMillis()-start));
}
}