仓酷云
标题:
JAVA编程:FileExtendedAttributes的退化历程仓酷云
[打印本页]
作者:
金色的骷髅
时间:
2015-1-18 11:22
标题:
JAVA编程:FileExtendedAttributes的退化历程仓酷云
学习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这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。
作者:
爱飞
时间:
2015-1-18 18:14
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者:
变相怪杰
时间:
2015-1-22 19:57
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者:
愤怒的大鸟
时间:
2015-1-31 10:00
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者:
只想知道
时间:
2015-2-4 02:39
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者:
admin
时间:
2015-2-6 10:18
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者:
若天明
时间:
2015-2-7 13:30
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者:
莫相离
时间:
2015-2-20 13:58
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
作者:
再见西城
时间:
2015-3-5 23:58
Java 编程语言的风格十分接近C、C++语言。
作者:
精灵巫婆
时间:
2015-3-6 19:33
是一种为 Internet发展的计算机语言
作者:
第二个灵魂
时间:
2015-3-9 20:45
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者:
兰色精灵
时间:
2015-3-20 00:53
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者:
小魔女
时间:
2015-4-7 16:18
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2