![跨域 解决方案_第1页](http://file4.renrendoc.com/view/b96a2c6a57e12e4efd6054bf670c8a23/b96a2c6a57e12e4efd6054bf670c8a231.gif)
![跨域 解决方案_第2页](http://file4.renrendoc.com/view/b96a2c6a57e12e4efd6054bf670c8a23/b96a2c6a57e12e4efd6054bf670c8a232.gif)
![跨域 解决方案_第3页](http://file4.renrendoc.com/view/b96a2c6a57e12e4efd6054bf670c8a23/b96a2c6a57e12e4efd6054bf670c8a233.gif)
![跨域 解决方案_第4页](http://file4.renrendoc.com/view/b96a2c6a57e12e4efd6054bf670c8a23/b96a2c6a57e12e4efd6054bf670c8a234.gif)
![跨域 解决方案_第5页](http://file4.renrendoc.com/view/b96a2c6a57e12e4efd6054bf670c8a23/b96a2c6a57e12e4efd6054bf670c8a235.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
解读Lucene.Net——一、Directory之一在使用Lucene.Net中,第一个接触的类一般是Directory。它是Lucene存储的一个抽象,由此派生了两个类:FSDirectory和RAMDirectory,用于控制索引文件的存储位置。使用FSDirectory类,就是存储到硬盘;使用RAMDirectory类,则是存储到内存。图1-1存储抽象实现UML图如图1-1,显示了这种关系。而看Lucene代码会发现,RAMDirectory和FSDirectoryJava版本转移过来,工具自动产生的。那就先看看Java代码的结构,然后再来看转移过来生成的内嵌类是干什么用的。Directory类一共有11个方法,看看类的注释就知道,翻译过来也是没有做非Java'si/oAPIsnotuseddirectly,butratheralli/oisthroughthisAPI.”。还保留着Java的解释了,虽然没有人会认为在dotNet平台会采用Java的API,Directory的注释原文:ADirectoryisaflatlistoffiles.Filesmaybewrittenonce,whentheyarecreated.Onceafileiscreateditmayonlybeopenedforread,ordeleted.Randomaccessispermittedbothwhenreadingandwriting.Java'si/oAPIsnotuseddirectly,butratheralli/oisthroughthisAPI.Thispermitsthingssuchas:implementationofRAM-basedindices;implementationindicesstoredinadatabase,viaJDBC;implementationofanindexasasinglefile;Directory是允许的。Java的I/O库没有被直接使用,所以的I/O操作都通过这个。这些存储可以允许:实现基于内存的索引;实现索引存入数据库,通过JDBC;实现一个索引是一个文件。而Directory的11个方法分别是:1、list把一个Directory对象下的文件,按字符串数组的方式返回;2、fileExists给定一个文件名,如果存在,就返回true;3、fileModified返回给定文件名被修改的时间;4、touchFile设置给定文件名文件的更新时间为现在;5、deleteFile删除当前directory对象下一个给定文件名的文件,该文件必须存在;6、renameFile重命名当前directory一个文件的文件名,如果新的名字在directory里已经存在,将会更换。这个要更换原子;7、fileLength返回文件的长度;8、createFile创建一个空文件,并且返回该文件的写入流;9、openFile10、makeLock锁定该directory对象;11、close关闭该对象。返回一个存在文件的读取流;而在Directory类中,使用的都是抽象方法,把这个类换成接口也可以。然后再来看看RAMDirectory类。RAMDirectory是Directory的内存操作实现。RAMDirectory类有5个重载构造函数。RAMDirectory()构造函数无操作;RAMDirectory(Directorydir)允许把硬盘上的索引载入内存,这个操作只就不行了。)这个构造函数只调用了RAMDirectory(Directorydir,booleancloseDir)构造函数,并未做其他动作。再来看看RAMDirectory(Directorydir,booleancloseDir)构造函数。除了默认构造函数,其他3个构造函数都是调用的这个构造函数做处理的。代码1-2:string[]files=dir.List();for(inti=0;i<files.Length;i++){//makeplaceonramdiskOutputStreamos=CreateFile(System.IO.Path.GetFileName(files[i]));//readcurrentfileInputStreamis_Renamed=dir.OpenFile(files[i]);//andcopytoramdiskintlen=(int)is_Renamed.Length();byte[]buf=newbyte[len];is_Renamed.ReadBytes(buf,0,len);os.WriteBytes(buf,len);//gracefulcleanupis_Renamed.Close();os.Close();}if(closeDir)dir.Close();其他两个构造函数用到了FSDirectory类把文件构造成Directory对象。看看代码就行了:代码1-3:publicRAMDirectory(System.IO.FileInfodir):this(FSDirectory.GetDirectory(dir,false),true){}publicRAMDirectory(System.Stringdir):this(FSDirectory.GetDirectory(dir,false),true){}这两个构造函数第二个参数都是true,和代码1-4:publicRAMDirectory(Directorydir):this(dir,false){}的Directory对象。对于传入的,也就是代码1-4,因为这个传入的对象是个引1-3是有它自身创建的Directory,关闭它并不会影响到RAMDirectory的外部。代码12的功能就是实现把硬盘上的索引按字节转存到内存中。首先,会创建一个文件,调用的是RAMDirectory自身的CreateFile方法:代码1-5publicoverrideOutputStreamCreateFile(System.Stringname){RAMFilefile=newRAMFile();files[name]=file;returnnewRAMOutputStream(file);}这个方法调用了两个还没讲的类。实现的功能就是创建一个内存的文件映像。在RAMDirectory定义了一个HashtableCreateFile被调用时,往里面填充创建的文件。所以,从硬盘往内存拷贝文件的过程中,这个哈希表就记录下了内存中所有被创建的文件。在List方法,就可以通过枚举的方式来获取内存中文件的数量。代码1-6publicoverrideSystem.String[]List(){System.String[]result=newSystem.String[files.Count];inti=0;System.Collections.IEnumeratornames=files.Keys.GetEnumerator();while(names.MoveNext()){result[i++]=((System.String)names.Current);}returnresult;}FileExists和FileModifiedCreateFile的代码很容易读懂:代码1-7///<summary>Returnstrueiffthenamedfileexistsinthisdirectory.</summary>publicoverrideboolFileExists(System.Stringname){RAMFilefile=(RAMFile)files[name];returnfile!=null;}///<summary>Returnsthetimethenamedfilewaslastmodified.</summary>publicoverridelongFileModified(System.Stringname){RAMFilefile=(RAMFile)files[name];returnfile.lastModified;}TouchFile的代码比较长,需要看一下代码1-8///<summary>Setthemodifiedtimeofanexistingfiletonow.</summary>publicoverridevoidTouchFile(System.Stringname){//finalbooleanMONITOR=false;RAMFilefile=(RAMFile)files[name];longts2,ts1=(System.DateTime.Now.Ticks-621355968000000000)/10000;do{try{System.Threading.Thread.Sleep(newSystem.TimeSpan((System.Int64)10000*0+100*1));}catch(System.Threading.ThreadInterruptedException){}ts2=(System.DateTime.Now.Ticks-621355968000000000)/10000;//////if(MONITOR){count++;}}while(ts1==ts2);file.lastModified=ts2;////if(MONITOR)System.out.println("SLEEPCOUNT:"+count);}RAMFile懂,为什么要减去个那数值呢?看看Java版的代码:代码1-9/**Setthemodifiedtimeofanexistingfiletonow.*/publicvoidtouchFile(Stringname)throwsIOException{//finalbooleanMONITOR=false;RAMFilefile=(RAMFile)files.get(name);longts2,ts1=System.currentTimeMillis();do{try{Thread.sleep(0,1);}catch(InterruptedExceptione){}ts2=System.currentTimeMillis();//if(MONITOR){//count++;//}}while(ts1==ts2);file.lastModified=ts2;//if(MONITOR)//System.out.println("SLEEPCOUNT:"+count);}看出来了,这段只是想计算时间的。为什么要这么计算时间呢?去FSDirectory类看到,他的方法就要简单很多代码1-10///<summary>Setthemodifiedtimeofanexistingfiletonow.</summary>publicoverridevoidTouchFile(System.Stringname){System.IO.FileInfofile=newSystem.IO.FileInfo(System.IO.Path.Combine(directory.FullName,name));file.LastWriteTime=System.DateTime.Now;}为什么在RAMDirectory需要这么来计算,那是为了取得一种随机数的效果,文件时间的更新如果是用DateTime.Now的话就会产生误差。通过这种算法,用Thread.Sleep的方式,然后通过循环对比,让两个时间产生差距,否则很可能会一样。要是一样,对文件版本的控制就不是很好。而这个睡眠0.01ms,速度很快,不会影响性能。实际上采用下面的方式也是一样的:代码1-11longts2,ts1=System.DateTime.Now.Ticks;do{try{System.Threading.Thread.Sleep(newSystem.TimeSpan((System.Int64)10000*0+100*1));}catch(System.Threading.ThreadInterruptedException){}ts2=System.DateTime.N
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新《行政处罚法》知识学习考试题库500题(含答案)
- 2025年福建省职教高考《语文》考前冲刺模拟试题库(附答案)
- 2025年桂林生命与健康职业技术学院高职单招语文2018-2024历年参考题库频考点含答案解析
- 10kV配电站房工程的成本控制与优化策略
- 国标柴油购销合同
- 居间合同委托书范文年
- 烟草产品购销合同
- 注册规划师聘用合同
- 土地平整工程承包合同
- 正规设备买卖交易合同
- 2024年北京东城社区工作者招聘笔试真题
- 一年级数学个位数加减法口算练习题大全(连加法-连减法-连加减法直接打印版)
- 五年级上册数学试题试卷(8篇)
- 五年级上册小数递等式计算200道及答案
- 冀教版五年级下册数学全册教学课件
- T-SDASTC 006-2023 眩晕病中西医结合基层诊疗指南
- 安全个人承诺书范文个人承诺书范文
- 远视储备培训课件
- 岭南膏方规范
- 【可行性报告】2023年虚拟演播室制作设备相关行业可行性分析报告
- 世界老年人跌倒的预防和管理指南解读及跌倒应急处理-
评论
0/150
提交评论