|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解正忙于的体系必要用到linux文件体系的扩大属性的特征,因为jdk6还未能供应API上的撑持,只好选用JNA来挪用Native办法完成了.
参考JNA的官方文档,中心部分的代码很复杂,以下:- 01interfaceNativeLibextendsLibrary{02NativeLibLIB=(NativeLib)synchronizedLibrary((NativeLib)loadLibrary("libc.so.6",NativeLib.class));03intsetxattr(Stringpathname,Stringname,Buffervalue,intsize,intflags);04intgetxattr(Stringpathname,Stringname,Buffervalue,intsize);05}
复制代码 在体系中挪用的代码,看上往会是如许的:- 01Bufferid=IntBuffer.wrap(newint[]{998});02NativeLib.LIB.setxattr("/path/to/file","user.id",id,4,0);
复制代码 下面的写法很包袱,利用起来不敷简便,若我是编写挪用的程序员,我大概会更喜好如许:- 01FileExtendedAttributesxattr=newFileExtendedAttributes("/path/to/file");02xattr.setId(998);
复制代码 因而,最后版本的FileExtendedAttributes完成会是:- 01publicfinalclassFileExtendedAttributes{02publicstaticfinalStringID="user.id";03privatefinalStringpath;04privateFileExtendedAttributes(Stringpath){this.path=path;}0506publicvoidsetId(intid)throwsIOException{07finalBufferbuffer=IntBuffer.wrap(newint[]{id});08finalintreturnCode=LIB.setxattr(path,ID,buffer,4,0);09if(returnCode==ERROR)thrownewIOException("Operationfailed,anderrornois"+returnCode);10}1112publicintgetId()throwsIOException{13finalIntBufferbuffer=IntBuffer.allocate(1);14finalintreturnCode=LIB.getxattr(path,ID,buffer,4);15if(returnCode==ERROR)thrownewIOException("Operationfailed,anderrornois"+returnCode);16returnbuffer.get(0);17}18}
复制代码 看上往不错.固然,这儿并不是只要id如许一个属性,另有replication,blockSize,length…
云云一个个加上完成的代码,很快就发明,我在不休的反复编写:- 01publicvoidsetXxx(Tvalue)throwsIOException{02finalBufferbuffer=TBuffer.wrap(newT[]{value});03finalintreturnCode=LIB.setxattr(path,Xxx,buffer,SIZE,0);04if(returnCode==ERROR)thrownewIOException("Operationfailed,anderrornois"+returnCode);05}0607publicTgetXxx()throwsIOException{08finalTBufferbuffer=TBuffer.allocate(1);09finalTreturnCode=LIB.getxattr(path,Xxx,buffer,SIZE);10if(returnCode==ERROR)thrownewIOException("Operationfailed,anderrornois"+returnCode);11returnbuffer.get(0);12}
复制代码 天晓得今后另有有几属性会变更,事变决不克不及像如许糟下往,究竟反复事变应当由电脑帮我们完成,否则程序员的代价安在?
细心察看代码纪律,能够抽取配合的办法:- 01publicstaticfinalStringUSER_PREFIX="user.";02publicstaticfinalintFLAGS=0;0304publicvoidset(Stringname,Bufferbuffer,intsize)throwsIOException{05throwIoExceptionIfFailed(LIB.setxattr(path,USER_PREFIX+name,buffer,size,FLAGS));06}0708publicvoidget(Stringname,Bufferbuffer,intsize)throwsIOException{09throwIoExceptionIfFailed(LIB.getxattr(path,USER_PREFIX+name,buffer,size));10}1112privatestaticvoidthrowIoExceptionIfFailed(intreturnCode)throwsIOException{13if(returnCode<0)14thrownewIOException("Operationfailed,anderrornois"+returnCode);15}
复制代码 接上去,只必要依据可预感的属性值范例供应多少人本接口便可了:- 01publicvoidset(Stringname,shortvalue)throwsIOException{set(name,buffer(value),2);}02publicvoidset(Stringname,intvalue)throwsIOException{set(name,buffer(value),4);}03publicvoidset(Stringname,longvalue)throwsIOException{set(name,buffer(value),8);}04publicvoidset(Stringname,Stringvalue)throwsIOException{set(name,buffer(value),value.getBytes().length);}0506publicshortgetShort(Stringname)throwsIOException{07finalShortBufferbuffer=ShortBuffer.allocate(1);08get(name,buffer,2);09returnbuffer.get(0);10}1112publicintgetInt(Stringname)throwsIOException{13finalIntBufferbuffer=IntBuffer.allocate(1);14get(name,buffer,4);15returnbuffer.get(0);16}1718publiclonggetLong(Stringname)throwsIOException{19finalLongBufferbuffer=LongBuffer.allocate(1);20get(name,buffer,8);21returnbuffer.get(0);22}2324publicStringgetString(Stringname,intsize)throwsIOException{25finalByteBufferbuffer=ByteBuffer.allocate(size);26get(name,buffer,size);27returnnewString(buffer.array());28}2930privatestaticBufferbuffer(shortvalue){returnShortBuffer.wrap(newshort[]{value});}31privatestaticBufferbuffer(intvalue){returnIntBuffer.wrap(newint[]{value});}32privatestaticBufferbuffer(longvalue){returnLongBuffer.wrap(newlong[]{value});}33privatestaticBufferbuffer(Stringvalue){returnByteBuffer.wrap(value.getBytes());}
复制代码 至于像setXxx之类的,因为属性变更大概太频仍,不如set(name,value)来的天真,并且如许也充足复杂,以是就省了吧.
嗯,差未几了.如果属性值范例不成预感,大概还可思索利用对象的多态性举行进一步重构,但就今朝的场景应当够用了吧.
出工!
完全代码请见https://github.com/zhongl/jtoolkit/blob/master/src/main/java/com/github/zhongl/jtoolkit/FileExtendedAttributes.java
首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。 |
|