mportjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Iterator;importjava.util.Random;/*** Purely informational so use at your own risk, it is not optimized and it can
* only handle data sets that have a size that is are divible by BUFFER_SIZE.
**/publicclassExternalSort {publicstaticintBUFFER_SIZE=10;publicFile sort(File file)throwsIOException {
ArrayListfiles=split(file);returnprocess(files);
}//recursive method to merge the lists until we are left with a//single merged listprivateFile process(ArrayListlist)throwsIOException {if(list.size()==1) {returnlist.get(0);
}
ArrayListinter=newArrayList();for(Iteratoritr=list.iterator(); itr.hasNext();) {
File one=itr.next();if(itr.hasNext()) {
File two=itr.next();
inter.add(merge(one, two));
}else{returnone;
}
}returnprocess(inter);
}/*** Splits the original file into a number of sub files.*/privateArrayListsplit(File file)throwsIOException {
ArrayListfiles=newArrayList();int[] buffer=newint[BUFFER_SIZE];
FileInputStream fr=newFileInputStream(file);booleanfileComplete=false;while(!fileComplete) {intindex=buffer.length;for(inti=0; i
buffer[i]=readInt(fr);if(buffer[i]==-1) {
fileComplete=true;
index=i;
}
}if(buffer[0]>-1) {
Arrays.sort(buffer,0, index);
File f=newFile("set"+newRandom().nextInt());
FileOutputStream writer=newFileOutputStream(f);for(intj=0; j
writeInt(buffer[j], writer);
}
writer.close();
files.add(f);
}
}
fr.close();returnfiles;
}/*** Merges two sorted files into a single file.
*
*@paramone
*@paramtwo
*@return*@throwsIOException*/privateFile merge(File one, File two)throwsIOException {
FileInputStream fis1=newFileInputStream(one);
FileInputStream fis2=newFileInputStream(two);
File output=newFile("merged"+newRandom().nextInt());
FileOutputStream os=newFileOutputStream(output);inta=readInt(fis1);intb=readInt(fis2);booleanfinished=false;while(!finished) {if(a!=-1&&b!=-1) {if(a
writeInt(a, os);
a=readInt(fis1);
}else{
writeInt(b, os);
b=readInt(fis2);
}
}else{
finished=true;
}if(a==-1&&b!=-1) {
writeInt(b, os);
b=readInt(fis2);
}elseif(b==-1&&a!=-1) {
writeInt(a, os);
a=readInt(fis1);
}
}
os.close();returnoutput;
}privatevoidwriteInt(intvalue, FileOutputStream merged)throwsIOException {
merged.write(value);
merged.write(value>>8);
merged.write(value>>16);
merged.write(value>>24);
merged.flush();
}privateintreadInt(FileInputStream fis)throwsIOException {intbuffer=fis.read();if(buffer==-1) {return-1;
}
buffer|=(fis.read()<<8);
buffer|=(fis.read()<<16);
buffer|=(fis.read()<<24);returnbuffer;
}/***@paramargs
*@throwsIOException*/publicstaticvoidmain(String[] args)throwsIOException {
File file=newFile("mainset");
Random random=newRandom(System.currentTimeMillis());
FileOutputStream fw=newFileOutputStream(file);for(inti=0; i
ger=ger<0?-ger : ger;
fw.write(ger);
fw.write(ger>>8);
fw.write(ger>>16);
fw.write(ger>>24);
}
fw.close();
ExternalSort sort=newExternalSort();
System.out.println("Original:");
dumpFile(sort, file);
File f=sort.sort(file);
System.out.println("Sorted:");
dumpFile(sort, f);
}privatestaticvoiddumpFile(ExternalSort sort, File f)throwsFileNotFoundException, IOException {
FileInputStream fis=newFileInputStream(f);inti=sort.readInt(fis);while(i!=-1) {
System.out.println(Integer.toString(i));
i=sort.readInt(fis);
}
}
}