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

📄 raid1.java

📁 软件模拟RAID系统。。 。。 。
💻 JAVA
字号:
import java.io.IOException;
import java.io.RandomAccessFile;

class writeCheck//注记为主附
{
	int a;
	int b;
	writeCheck(int a,int b)
	{
		this.a=a;
		this.b=b;
	}
}

public class Raid1 implements Raid {
	writeCheck[] wc;
	int arrow=0;//标记目前在用第几个主附类
	 String inFileName;
	 String outFileName;
	 RandomAccessFile in;
	 RandomAccessFile out[];
	 int n;
	 int begin=0;
	 int length;
	 int CAPACITY;
	 public int[] capRemain;
	 int[] waste;
	 byte[] cbuf;
	 int ReadAble;
	 public boolean Readable()
	 {
		 return(ReadAble!=-1);
	 }
	 public boolean Storeable()
	 {
		 for(int i=0;i<n/2;i++)
		 {
			 if(capRemain[wc[i].a]-waste[wc[i].a]>=length)
			 {
				 arrow=i;
				 return true;
			 } 
		 }
			 System.out.println ("磁盘空间不足,该块写入失败");
		 return false;
	 }
		public int Capcity()
		{
			return CAPACITY;
		}
		public void capcity_Remained(int[]a)
		{
			for(int i=0;i<2;i++)
			{
				a[i]=capRemain[i];
			}
		}
		public int Cap_available()
		{
			return(capRemain[0]-waste[0]);
		}
	public void ReadBlock() throws IOException
		{
		ReadAble=in.read(cbuf,0,length);
		if(ReadAble==-1){System.out.println("文件结束或不足一条,读入终止");}
		}
	public void StoreBlock() throws IOException
	{
		int id = wc[arrow].a;
		int check=wc[arrow].b;
				if(capRemain[id]<length)
					{
					System.out.println("磁盘"+id+"容量"+capRemain[id]+"不足"+length+",写入失败");
					}
				out[id].write(cbuf, 0, length);
				System.out.println("磁盘"+id+"写入数据");
				out[check].write(cbuf,0, length);
				System.out.println("磁盘"+check+"备份数据");
				capRemain[id]-=length;
				capRemain[check]-=length;
				System.out.println("磁盘"+id+"剩余容量为"+capRemain[id]);
				System.out.println("磁盘"+check+"剩余容量为"+capRemain[check]);
			}
	public void Recover(int downID) throws IOException
	{
		int backupid = 0;
		byte[] temp=new byte[1];//防止恢复是出猥琐的错误 单字节恢复而不是单块恢复
		for(int i=0;i<n/2;i++)
		{
			if(wc[i].a==downID)
				backupid=wc[i].b;
			if(wc[i].b==downID)
				backupid=wc[i].a;
		}
		RandomAccessFile bac= new RandomAccessFile("" + backupid+ "_"+outFileName,"r");
		RandomAccessFile rec= new RandomAccessFile("" +downID+ "_"+"RECOVER_"+outFileName,"rw");
		while(bac.read(temp)!=-1)
		{
			rec.write(temp);
		}
	}
	/********************************
	*构造函数
	********************************/
	Raid1(String inf,String outf,int n,int l,writeCheck[] wc,int[]cap)throws IOException
	{//其中wc规模必须为n/2 n必须为偶数
		this.wc=wc;
		this.n=n;
		CAPACITY=0;
		Cal c=new Cal();
		cbuf=new byte[l];
		inFileName=inf;
		outFileName=outf;
		capRemain=new int[n];
		for(int i=0;i<n;i++)
		{
			 capRemain[i]=cap[i];
			 System.out.println("磁盘"+i+"剩余容量为"+capRemain[i]);
		}
		length=l;
		in= new RandomAccessFile(inf,"r");
		out = new RandomAccessFile[n];
		int[] min=new int[n/2];
		int[] minmun=new int[n];
		waste=new int[n];
		for(int i=0;i<n;i++)
			out[i] = new RandomAccessFile ("" + i + "_" +outFileName,"rw");
		for(int j=0;j<n/2;j++)
		{
			min[j]=c.Min(cap[wc[j].a], cap[wc[j].b]);
			minmun[wc[j].a]=minmun[wc[j].b]=min[j];
		CAPACITY+=min[j]/length*length;
		}
		
		for(int i=0;i<n;i++)
		{
			waste[i]=cap[i]-minmun[i]/length*length;
		}
		
		/*int min=c.Min(cap, 2);
		cbuf=new byte[l];
		inFileName=inf;
		outFileName=outf;
		capRemain=new int[2];
		for(int i=0;i<2;i++)
		{
			 capRemain[i]=cap[i];
			 System.out.println("磁盘"+i+"剩余容量为"+capRemain[i]);
		}
		length=l;
		in= new RandomAccessFile(inf,"r");
		out = new RandomAccessFile[2];
		for(int i=0;i<2;i++)
			out[i] = new RandomAccessFile ("" + i + "_" +outFileName,"rw");
		CAPACITY=min/length*length;
		waste=new int[2];
		for(int i=0;i<2;i++)
		{
			waste[i]=cap[i]-min/length*length;
		}
		*/
	}
}

⌨️ 快捷键说明

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