⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dealfile.java

📁 一个java写的面向对象流的简单的文件系统,理论研究的吧
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package dealfile;
/*
 *do by jjl2009 03-03~~~03~06
 *
 *
 **/
import java.io.*;
import java.util.*;
import active.*;
class dealFile {
	private static boolean init=false;
	private static RandomAccessFile raf;
	private static RandomAccessFile Braf;
	public Long DangerBufferPoistion=new Long(8*100);//文件头指示区的大小
	static Vector vActiveBuf=new Vector();//内存活动缓存
	int size;//当前内存缓存中活动的数目
	//内存文件标示区
	Long prePostion=new Long(0);//前一个活动块的地址
	Long curPostion=new Long(0);//当前活动块的地址
	Long EndPostion=new Long(0);//文件尾地址
	int ActiveCount=0;//当前活动块总数
	Long FileHeadEnd=new Long(0);//当前文件指示区首址
	int FileHeadSize=0;//文件头的大小
	public dealFile(){
		if(!init){
			System.out.println("正在尝试初始化");
				try{
				File file=new File("active.inr");
				if(!file.exists()){
					System.out.println("系统文件不存在!创建系统文件");
					file.createNewFile();
					raf=new RandomAccessFile(file,"rw");
					System.out.println("开始初始化系统文件区");
					raf.writeLong(832);//标记当前文件区首址
					raf.writeLong(832);//文件尾地址
					raf.writeInt(0);//当前文件总数
					raf.writeInt(0);//设置当前文件首块指示区的大小
					raf.writeLong(32);//当前活动块尾址
					//32个字节来指示头	
					///////////////////////////////////
					//初始化第一块文件块
					raf.seek(832);
					raf.writeInt(0);//文件大小为0
					raf.writeLong(832);//前一个活动块为832
					raf.seek(32);//移到文件头指示区
					raf.writeLong(832);//记录活动块
					System.out.println("初始化文件系统成功!");
				}else{
					raf=new RandomAccessFile(file,"rw");
					System.out.println("创建文件读放工具成功");
				}
				raf.seek(0);
				curPostion=raf.readLong();//获取最新活动的区的首块号
				if(curPostion==-1){//如果是文件不为初始状态
					return;
				}else{
					//初始化内存文件标示区
					System.out.println("读取文件的头部分!");
					System.out.println("当前文件区首址:"+curPostion);
					EndPostion=raf.readLong();
					System.out.println("当前文件区尾址:"+EndPostion);
					ActiveCount=raf.readInt();
					System.out.println("当前活动总数:"+ActiveCount);
					FileHeadSize=raf.readInt();
					System.out.println("文件首块头的大小:"+FileHeadSize);
					FileHeadEnd=raf.readLong();
					System.out.println("文件首块头的尾部地址:"+FileHeadEnd);
					raf.seek(curPostion);//到当前活跃的活动处读取内容
					int s=raf.readInt();
					prePostion=raf.readLong();
					for(int i=0;i<s;i++){//获取当前活动的数目
						Active active=new Active();
						active.setStatus(raf.readInt());//读取当前活动状态
						active.setActiveName(raf.readUTF());
						active.setActiveTime(raf.readUTF());
						Vector vPeaple=new Vector();
						int k=raf.readInt();
						for(int j=0;j<k;j++){
							vPeaple.addElement(raf.readUTF());
						}
						active.setActivePeaple(vPeaple);
						Vector vImages=new Vector();
						k=raf.readInt();
						for(int j=0;j<k;j++){
							vImages.addElement(raf.readUTF());
						}
						active.setActiveImages(vImages);
						active.setActiveContent(raf.readUTF());
						active.setActiveComment(raf.readUTF());
						vActiveBuf.addElement(active);
						size++;	
						System.out.println("............."+i+".............");
						active.testActive();	
						System.out.println("..............................");
					}
					System.out.println("当前活动块的前一个活动的首址:"+prePostion);
					backup(0);
					testTheBuffer();
				}
				init=true;//标记已成功初始化
				System.out.println("已成功初始化");
			}catch(Exception e){
				System.out.println(e);
				System.out.println("初始化是存在故障!...............");
			}
		}
	}
	public void removeActive(Active active){
		System.out.println("清除当前活动");
		active.testActive();
		int i=findActive(active);
		if(i==-1)return;
		else{
			if(((Active)vActiveBuf.get(i)).getStatus()==0)
			{
				((Active)vActiveBuf.get(i)).setStatus(-1);//标记当前文件已清除
				if(curPostion==EndPostion){
					vActiveBuf.removeElementAt(i);
					backup(1);
				}
			}
		}
	}
	public void editActive(Active active){
		System.out.println("编辑当前活动");
		active.testActive();
		System.out.println("....................");
		int i=findActive(active);
		if(i==-1)return;//如果不存在相应活动,则返回
		else{
	//	if(((Active)vActiveBuf.get(i)).getStatus()==0)//如果文件是未修改状态,则可修改
		//	{
				if(curPostion==EndPostion){//如果是当前新建状态
				vActiveBuf.add(i,active);//在相应缓存区放入相应的活动
				backup(1);//备份
				}else{
					((Active)vActiveBuf.get(i)).setStatus(1);//标记活动已修改
					flushBuffer();//清空内存区;
					putEditActive((Active)vActiveBuf.get(i));	//在文件编辑区登记
				}
				
			//}
		}
	}
	
	public int findActive(Active active){	//低效遍历访问得到active对象
	System.out.println("寻找当前活动");
	active.testActive();
	System.out.println("....................");
		try{
			raf.seek(0);
			if(raf.readLong()==-1){
				return -1;
			}
			if(vActiveBuf.size()!=0){
				for(int i=0;i<vActiveBuf.size();i++){
					if(((Active)vActiveBuf.get(i)).getActiveName().equals(active.getActiveName())){
						//如果找到了该对象,则删除他
						return i;
					}
				}
				if(curPostion==0)return -1;//如果文件区已遍历结束,则返回-1,说明无相关活动	
				getNextActiveBlock();
				return findActive(active);
			}
			else{
				return findActive(active);
			}
		}catch(Exception e){
			System.out.println(e);
			return -1;
		}
	}
	public int findActiveFromBuffer(Active active){
		if(vActiveBuf.size()==0)return -1;
		else{
			for(int i=0;i<vActiveBuf.size();i++){
					if(((Active)vActiveBuf.get(i)).getActiveName().equals(active.getActiveName())){
						//如果找到了该对象,则删除他
						return i;
					}
				}
			return -1;//如果文件区已遍历结束,则返回-1,说明无相关活动
		}
	}
	public int findActiveEffective(Active active1){
		flushBuffer();
		vActiveBuf.removeAllElements();
		int s=raf.seek(20);
		Long p=raf.getPointer();
		for(int i=0;i<s;i++){
			raf.seek(p);
			Long postion=raf.readLong();
			p=raf.getPointer();
			raf.seek(postion);
			curPostion=postion;
			int c=raf.readInt();
			prePostion=raf.readLong();
			for(int j=0;j<c;j++){
				Active active=new Active();
				active.setStatus(raf.readInt());//读取当前活动状态
				active.setActiveName(raf.readUTF());
				active.setActiveTime(raf.readUTF());
				Vector vPeaple=new Vector();
				int k1=raf.readInt();
				for(int j1=0;j<k1;j1++){
					vPeaple.addElement(raf.readUTF());
				}
				active.setActivePeaple(vPeaple);
				Vector vImages=new Vector();
				k1=raf.readInt();
				for(int j1=0;j<k1;j1++){
					vImages.addElement(raf.readUTF());
				}
				active.setActiveImages(vImages);
				active.setActiveContent(raf.readUTF());
				active.setActiveComment(raf.readUTF());
				vActiveBuf.addElement(active);
				size++;	
			}
			if((int id=findActiveFormBuffer(active1))!=-1){
				return id;
			}
		}
		return -1;
	}
	public Long flushBuffer(){//清空内存区
//	System.out.println("开始清空内存区");
		if(vActiveBuf.size()<100){
			backup(1);
			return null;
		}
		Long p=EndPostion;
		if(raf==null){
			try{
			System.out.println("尝试重读系统文件,请稍等...");
			File file=new File("active.inr");
			if(!file.exists()){
				System.out.println("系统文件丢失...");
				return EndPostion;
			}else{
				raf=new RandomAccessFile(file,"rw");
				System.out.println("重新获得系统文件读放工具!");
			}
			}catch(Exception e){
				System.out.println(e);
				System.out.println("出现故障在清空缓存区的时候!");
				return EndPostion;
			}	
		}
		try{
		raf.seek(curPostion);//转到当前活动块
		System.out.println("开始将缓存区内容写入硬盘!");
		if(vActiveBuf.size()==0)return EndPostion;
		raf.writeInt(vActiveBuf.size());
	//	System.out.println("当前的活动块的前一个的首址"+prePostion);	
		raf.writeLong(prePostion);	
		for(int i=0;i<vActiveBuf.size();i++){
			Active active=(Active)vActiveBuf.get(i);
			raf.writeInt(0);//当前活动状态为0,代表活动有效
			raf.writeUTF(active.getActiveName());
			raf.writeUTF(active.getActiveTime());
			Vector vPeaple=(Vector)active.getActivePeaple();
			raf.writeInt(vPeaple.size());
			for(int j=0;j<vPeaple.size();j++){
				raf.writeUTF(vPeaple.get(i).toString());
			}
			Vector vImages=(Vector)active.getActivePeaple();
			raf.writeInt(vImages.size());
			for(int j=0;j<vImages.size();j++){
				raf.writeUTF(vImages.get(i).toString());
			}
			raf.writeUTF(active.getActiveContent());
			raf.writeUTF(active.getActiveComment());	
		}
		p=raf.getFilePointer();
		System.out.println("当前活动块的尾址:"+raf.getFilePointer());	
		if(p!=prePostion){
			prePostion=curPostion;
			System.out.println("当前活动块是新文件块!");
		//	raf.seek(curPostion);
		//	raf.writeLong(vActiveBuf.size());
			raf.seek(p);
			raf.writeInt(0);
			System.out.println("当前文件活动块大小为:"+vActiveBuf.size());
			System.out.println("当前旧文件的首地址为:"+curPostion);
			raf.writeLong(curPostion);
			curPostion =p;
			EndPostion=p;
			if(FileHeadSize>100){
				FileHeadSize=0;
			}
			raf.seek(0);//转到当前文件头
			raf.writeLong(curPostion);//记录当前活动块
	//		System.out.println("curpostion:"+curPostion);
			raf.writeLong(EndPostion);//记录当前文件尾地址
	//		System.out.println("Endpostion:"+EndPostion);
			raf.writeInt(ActiveCount+1);//当前文件总数
	//		System.out.println("ActiveCount:"+new Integer(ActiveCount+1));
			raf.writeInt(FileHeadSize+1);//当前首块指示区大小
			raf.writeLong(new Long(32+(FileHeadSize+1)*8));//头指示区尾址
	//		System.out.println("FileHeadSize:"+new Integer(FileHeadSize+1));
			raf.seek(FileHeadEnd);//移到文件头指示区
	//		System.out.println("FileHeadEnd:"+new Long(32+(FileHeadSize+1)*8));
			raf.writeLong(curPostion);//记录活动块
		//	System.out.println("新建新的活动块成功!");
			raf.seek(curPostion);
			System.out.println(".............测试新活动块的头部分!..................");
			System.out.println("new active Block head: "+raf.readInt());
			System.out.println(raf.readLong());
			System.out.println("......................................................");
		}
		System.out.println("内存区已清空完毕");
		}catch(Exception e){
			System.out.println(e);
			System.out.println(".................写入新活动块失败!........................");
		}
		
		return p;//记录当前文件尾;
	}
	public void getNextActiveBlock(){//获得下一个活动块
	try{
		if(raf==null){
			System.out.println("尝试重读系统文件,请稍等...");
			File file=new File("active.inr");
			if(!file.exists()){
				System.out.println("系统文件丢失...");
				return;
			}else{
				raf=new RandomAccessFile(file,"rw");
			}	
		}
		System.out.println("移到下一个活动块!.......");		
		curPostion=prePostion;
		vActiveBuf.removeAllElements();
		System.out.println("当前活动块的首址:"+curPostion);
		raf.seek(prePostion);
		System.out.println("正在填充内存缓存区...");
		int s=raf.readInt();
		prePostion=raf.readLong();
	//	System.out.println("当前活动的前一个的首址"+prePostion);
		if(prePostion==curPostion)return;
		for(int i=0;i<s;i++){
			Active active=new Active();
			raf.readInt();//读取活动的状态
			active.setActiveName(raf.readUTF());
			active.setActiveTime(raf.readUTF());
			Vector vPeaple=new Vector();
			int k=raf.readInt();
			for(int j=0;j<k;j++){
				vPeaple.addElement(raf.readUTF());
			}
			active.setActivePeaple(vPeaple);
			Vector vImages=new Vector();
			k=raf.readInt();
			for(int j=0;j<k;j++){
				vImages.addElement(raf.readUTF());
			}
			active.setActiveImages(vImages);
			active.setActiveContent(raf.readUTF());
			active.setActiveComment(raf.readUTF());
			vActiveBuf.addElement(active);
			System.out.println(".................test the get next block!"+i+"..........." );
			active.testActive();		
			System.out.println(".................test the get next block!end.........." );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -