📄 dealfile.java
字号:
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 + -