📄 raid1.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 + -