简谈Java API- -
学精Java,必须得学精API。在这儿给出精简的Java API 分类:
JavaBeans API
为了应付微软公司ActiveX的威胁,JavaSoft开发了JavaBeans,一种平台中立的创建软件组件的规范。JavaBeans规范的一部分实际上解决了与ActiveX组件的接口问题。
Java Commerce API
Java Commerce API是一种基于Internet的API,可在不可靠的网络上进行可靠的经济事务。这种API包括了客户端xyk、借贷卡和电子现金等事务的框架-----Java Wallet。
Java 核心API
Java核心API包括JDK 装载的库,其中有javaapplet、javaawt、javaio、javalang、javanet和javautil包,并提供了用Java建立小应用程序和简单应用程序所必需的核心级函数。
Java Embedded API
Java Embedded API能够工作在蜂窝电话和微波炉这些不能支持整套Java核心函数的设备上,提供了Java核心的一个子集。
Java Enterprise API
Java Enterprise API实际上包括三个分别提供组织资源与应用程序访问的库。1、Java数据库连接(JDBC)API提供了数据库连接。利用JDBC,一个应用程序就可以独立于数据存贮的实际数据库引擎,实现对数据库的访问。同样的应用程序只需要写一次、编译一次,就可以运行在装有JDBC驱动程序的任何数据库引擎上。
2、IDL(接口定义语言,Interface Definition Language)使Java应用程序在Java对象和网络定位对象之间提供一个对语言中立的接口,它遵循对象管理组(OMG,Object Management Group)的IDL规范。
3、远程方法调用(RMI)是一种允许对象在网络定位对象上调用方法的特殊API,与IDL不同的是,它仅在Java中应用。不需要利用套接字(Socket)来写复杂的通信协议,一个应用程序只需要通过简单的Java方法调用就与远程目标进行通信。
Java Management API
Java Management API使应用程序具有网络管理的功能。
Java Media API
Java Media API创建一个单独的API,使开发人员可以利用各种各样的多媒体硬件设备的接口编写内容丰富的多媒体应用程序。媒体框架(Media Frameworks)可以为音频、视频和MIDI提供同步的时钟。2D和3D库提供了增强的图像类,动画API可以使应用程序对2D图像进行转换。Telephony提供了利用单独的APi访问电话设备的应用程序。
Java Security API
Java Security API用一个单独的API来加强应用程序的安全性,包括加密、解密和身份鉴定的能力。
Java Server API
Java Server API是对CGI的应答,这个API允许开发人员用小服务程序或用户上载到网络或服务器上的可执行程序,来与Internet服务器进行交互或增强功能。
JAVA的JDK和API的区别是:
1、Java好比房子,API好比土地,JDK好比开发商的关系。
2、JDK与API都是为了JAVA,互依互存,又各自独立,只有共同才能创造价值。
一、全称:
1、JDK:JavaDevelopmentKit。
2、API:ApplicationProgrammingInterface。
二、概念:
1、Java:是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
2、JDK:
(1)、JDK是Sun针对Java开发员的产品。JDK本身使用了Java语言编写。简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是SoftwareDevelopmentKit一般指软件开发包,可以包括函数库、编译程序等。
(2)、自从Java推出以来,JDK已经成为使用最广泛的JavaSDK(Softwaredevelopmentkit)。
3、API:
(1)、API是应用程序编程接口。
(2)、是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
三、作用:
1、JDK:
(1)、jdk是Java语言的软件开发工具包。主要用于移动设备、嵌入式设备上的java应用程序。
(2)、JDK是整个Java的核心,包括了Java运行环境(JavaRuntimeEnvirnment),一堆Java工具和Java基础的类库(rtjar)。
(3)、不论什么Java应用服务器实质都是内置了某个版本的JDK。
2、API:
(1)、运行Java程序时,虚拟机装载程序的class文件所使用的JavaAPIclass文件。
(2)、avaAPI在Java安全性模型方面也有贡献。当JavaAPI的方法进行任何有潜在危险的 *** 作(比如进行本地磁盘写 *** 作)之前,都会通过查询访问控制器来检验是否得到了授权。访问控制器是一个类,该类用来执行栈检验,已决定是否允许某种 *** 作。
四、其它:
1、JDK:
(1)、JDK包含的基本组件包括:javac_编译器、jar_打包工具、javadoc_文档生成器、jdb_debugger-查错工具、java_运行编译后的java程序、-小程序浏览器、Javap-Java反汇编器、Jconsole:Java进行系统调试和监控的工具等。
(2)、jdk18新特性:
(1)、Java8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可。
(2)、新增lambda表达式
(3)、提供函数式接口
(4)、Java8允许你使用::关键字来传递方法或者构造函数引用
(5)、我们可以直接在lambda表达式中访问外层的局部变量。
2、API:组成及特点:
(1)、所有被装载的class文件(包括从应用程序中和从JavaAPI中提取的)和所有已经装载的动态库(包含本地方法)共同组成了在Java虚拟机上运行的整个程序。
(2)、在一个平台能够支持Java程序以前,必须在这个特定平台上明确地实现API的功能。
(3)、为访问主机上的本地资源,JavaAPI调用了本地方法。
(4)、由于JavaAPIclass文件调用了本地方法,Java程序就不需要再调用它们了。
(5)、通过这种方法,JavaAPIclass文件为底层主机提供了具有平台无关性、标准接口的Java程序。
(6)、对Java程序而言,无论平台内部如何,JavaAPI都会有同样的表现和可预测的行为。
(7)、正是由于在每个特定的主机平台上明确地实现了Java虚拟机和JavaAPI,因此,Java程序自身就能够成为具有平台无关性的程序。
需要用的时候再去查API文档 ,就像是字典,需要用的时候才去差。看就没必要了
查的话 当你在写程序的时候遇到不知道的方法或类的时候,一般Eclipse都会有提示这个类或者这个方法属于的类是在哪个包里的,你在根据这个去查找
如果你下载一个chm格式的文档还可以直接搜索
众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法;
例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有办法去控制内存什么时候向磁盘写入,很恶心,而且这些API在内存构造的对象大小将比数据原有的大小要大很多倍数,所以你不得不去拆分Excel,还好,POI开始意识到这个问题,在384的版本后,开始提供cache的行数,提供了SXSSFWorkbook的接口,可以设置在内存中的行数,不过可惜的是,他当你超过这个行数,每添加一行,它就将相对行数前面的一行写入磁盘(如你设置2000行的话,当你写第20001行的时候,他会将第一行写入磁盘),其实这个时候他些的临时文件,以至于不消耗内存,不过这样你会发现,刷磁盘的频率会非常高,我们的确不想这样,因为我们想让他达到一个范围一次性将数据刷如磁盘,比如一次刷1M之类的做法,可惜现在还没有这种API,很痛苦,我自己做过测试,通过写小的Excel比使用目前提供刷磁盘的API来写大文件,效率要高一些,而且这样如果访问的人稍微多一些磁盘IO可能会扛不住,因为IO资源是非常有限的,所以还是拆文件才是上策;而当我们写CSV,也就是文本类型的文件,我们很多时候是可以自己控制的,不过你不要用CSV自己提供的API,也是不太可控的,CSV本身就是文本文件,你按照文本格式写入即可被CSV识别出来;如何写入呢?下面来说说。。。
在处理数据层面,如从数据库中读取数据,生成本地文件,写代码为了方便,我们未必要1M怎么来处理,这个交给底层的驱动程序去拆分,对于我们的程序来讲我们认为它是连续写即可;我们比如想将一个1000W数据的数据库表,导出到文件;此时,你要么进行分页,oracle当然用三层包装即可,mysql用limit,不过分页每次都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动,编译一部分数据(如10000行)将写文件一次(写文件细节不多说了,这个是最基本的),需要注意的时候每次buffer的数据,在用outputstream写入的时候,最好flush一下,将缓冲区清空下;接下来,执行一个没有where条件的SQL,会不会将内存撑爆?是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些 *** 作,例如,通过:PreparedStatement statement = connectionprepareStatement(sql),这是默认得到的预编译,还可以通过设置:
PreparedStatement statement = connectionprepareStatement(sql,ResultSetTYPE_FORWARD_ONLY,ResultSetCONCUR_READ_ONLY);
来设置游标的方式,以至于游标不是将数据直接cache到本地内存,然后通过设置statementsetFetchSize(200);设置游标每次遍历的大小;OK,这个其实我用过,oracle用了和没用没区别,因为oracle的jdbc API默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效,我上面说了一堆废话,呵呵,我只是想说,java提供的标准API也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的,但是这纯属抄袭;对于oracle上面说了不用关心,他本身就不是cache到内存,所以java内存不会导致什么问题,如果是mysql,首先必须使用5以上的版本,然后在连接参数上加上useCursorFetch=true这个参数,至于游标大小可以通过连接参数上加上:defaultFetchSize=1000来设置,例如:
jdbc:mysql://xxxxxxxxxxxx:3306/abc?zeroDateTimeconvertToNull&useCursorFetch=true&defaultFetchSize=1000< /span>
上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀,并行2个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最后经过mysql文档的确认,然后进行测试,并行多个,而且数据量都是500W以上的,都不会导致内存膨胀,GC一切正常,这个问题终于完结了。
我们再聊聊其他的,数据拆分和合并,当数据文件多的时候我们想合并,当文件太大想要拆分,合并和拆分的过程也会遇到类似的问题,还好,这个在我们可控制的范围内,如果文件中的数据最终是可以组织的,那么在拆分和合并的时候,此时就不要按照数据逻辑行数来做了,因为行数最终你需要解释数据本身来判定,但是只是做拆分是没有必要的,你需要的是做二进制处理,在这个二进制处理过程,你要注意了,和平时read文件不要使用一样的方式,平时大多对一个文件读取只是用一次read *** 作,如果对于大文件内存肯定直接挂掉了,不用多说,你此时因该每次读取一个可控范围的数据,read方法提供了重载的offset和length的范围,这个在循环过程中自己可以计算出来,写入大文件和上面一样,不要读取到一定程序就要通过写入流flush到磁盘;其实对于小数据量的处理在现代的NIO技术的中也有用到,例如多个终端同时请求一个大文件下载,例如视频下载吧,在常规的情况下,如果用java的容器来处理,一般会发生两种情况:
其一为内存溢出,因为每个请求都要加载一个文件大小的内存甚至于更多,因为java包装的时候会产生很多其他的内存开销,如果使用二进制会产生得少一些,而且在经过输入输出流的过程中还会经历几次内存拷贝,当然如果有你类似nginx之类的中间件,那么你可以通过send_file模式发送出去,但是如果你要用程序来处理的时候,内存除非你足够大,但是java内存再大也会有GC的时候,如果你内存真的很大,GC的时候死定了,当然这个地方也可以考虑自己通过直接内存的调用和释放来实现,不过要求剩余的物理内存也足够大才行,那么足够大是多大呢?这个不好说,要看文件本身的大小和访问的频率;
其二为假如内存足够大,无限制大,那么此时的限制就是线程,传统的IO模型是线程是一个请求一个线程,这个线程从主线程从线程池中分配后,就开始工作,经过你的Context包装、Filter、拦截器、业务代码各个层次和业务逻辑、访问数据库、访问文件、渲染结果等等,其实整个过程线程都是被挂住的,所以这部分资源非常有限,而且如果是大文件 *** 作是属于IO密集型的 *** 作,大量的CPU时间是空余的,方法最直接当然是增加线程数来控制,当然内存足够大也有足够的空间来申请线程池,不过一般来讲一个进程的线程池一般会受到限制也不建议太多的,而在有限的系统资源下,要提高性能,我们开始有了new IO技术,也就是NIO技术,新版的里面又有了AIO技术,NIO只能算是异步IO,但是在中间读写过程仍然是阻塞的(也就是在真正的读写过程,但是不会去关心中途的响应),还未做到真正的异步IO,在监听connect的时候他是不需要很多线程参与的,有单独的线程去处理,连接也又传统的socket变成了selector,对于不需要进行数据处理的是无需分配线程处理的;而AIO通过了一种所谓的回调注册来完成,当然还需要OS的支持,当会掉的时候会去分配线程,目前还不是很成熟,性能最多和NIO吃平,不过随着技术发展,AIO必然会超越NIO,目前谷歌V8虚拟机引擎所驱动的nodejs就是类似的模式,有关这种技术不是本文的说明重点;
将上面两者结合起来就是要解决大文件,还要并行度,最土的方法是将文件每次请求的大小降低到一定程度,如8K(这个大小是经过测试后网络传输较为适宜的大小,本地读取文件并不需要这么小),如果再做深入一些,可以做一定程度的cache,将多个请求的一样的文件,cache在内存或分布式缓存中,你不用将整个文件cache在内存中,将近期使用的cache几秒左右即可,或你可以采用一些热点的算法来配合;类似迅雷下载的断点传送中(不过迅雷的网络协议不太一样),它在处理下载数据的时候未必是连续的,只要最终能合并即可,在服务器端可以反过来,谁正好需要这块的数据,就给它就可以;才用NIO后,可以支持很大的连接和并发,本地通过NIO做socket连接测试,100个终端同时请求一个线程的服务器,正常的WEB应用是第一个文件没有发送完成,第二个请求要么等待,要么超时,要么直接拒绝得不到连接,改成NIO后此时100个请求都能连接上服务器端,服务端只需要1个线程来处理数据就可以,将很多数据传递给这些连接请求资源,每次读取一部分数据传递出去,不过可以计算的是,在总体长连接传输过程中总体效率并不会提升,只是相对相应和所开销的内存得到量化控制,这就是技术的魅力,也许不要太多的算法,不过你得懂他。
类似的数据处理还有很多,有些时候还会将就效率问题,比如在HBase的文件拆分和合并过程中,要不影响线上业务是比较难的事情,很多问题值得我们去研究场景,因为不同的场景有不同的方法去解决,但是大同小异,明白思想和方法,明白内存和体系
架构,明白你所面临的是沈阳的场景,只是细节上改变可以带来惊人的效果。
>
就是查呀!
有的文档没有索引,你就按包名类名查看他每个方法的具体作用
有的文档有索引
你输入方法名或者类名
就可以直接搜索出来了
主要是看类的说明、构造方法和其他方法,包括方法作用,输入参数,返回的对象,还有方法是静态方法还是实例方法
以上就是关于怎么用JAVA的API呀全部的内容,包括:怎么用JAVA的API呀、JAVA的JDK和API的区别、JAVA,谁来教我如何用正确的方法去看API文档啊,最好举个例子等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)