精华内容
下载资源
问答
  • 对比java和python

    千次阅读 2017-08-15 12:43:04
    对比java和python   1.难易度而言。python远远简单于java。  2.开发速度。Python远优于java  3.运行速度。java远优于标准python,pypy和cython可以追赶java,但是两者都没有成熟到可以做项目的程度。  4....


    对比java和python 

      1.难易度而言。python远远简单于java。
      2.开发速度。Python远优于java
      3.运行速度。java远优于标准python,pypy和cython可以追赶java,但是两者都没有成熟到可以做项目的程度。
      4.可用资源。java一抓一大把,python很少很少,尤其是中文资源。
      5.稳定程度。python3和2不兼容,造成了一定程度上的混乱以及大批类库失效。java由于有企业在背后支持所以稳定的多。
      6.是否开源。python从开始就是完全开源的。Java由sun开发,但现在有GUN的Openjdk可用,所以不用担心。
      7.编译还是解释。两者都是解释型。
      我理解,C好比手动挡车(编译型语言),java和python(解释型语言)好比自动档车。跑的最快的车都是手动档,但是对开不好的人来说,开自动档反而更快些。
      Kno有一篇文章谈到选择编程语言,“先确定你的需求”,不要由语言的简单还是复杂去觉定。只有能够编写你真正认为有用的程式,才能获得满足感,学习才能继续。
      那么java和python分别适用于什么样的环境呢。由sourceforge.net可以看出:
      最著名,久经考验的普通应用程序,基本都是c++写的。例如emule,7-zip,WinSCP,FileZilla等等等。
      一部分由java开发,例如最有名的OpenOffice。
      python写的很少,如Pidgin,FireBird。
      开发语言(有多少个程式由此语言开发)的排行如下:
      # Java46,202
      # C++36,895
      # PHP30,048
      # C28,075
      # C#13,476
      # Python13,379
      # JavaScript11,285
      # Perl9,216
      # Unix Shell3,869
      # Delphi/Kylix3,548
      # Visual Basic3,186
      # Visual Basic .NET
      很多框架和类库也和应用软件一样在这个列表里,因此比较公平。
      由此可以看出,java不管在GNU还是商业领域都是应用最广的语言。C主要用于构建系统底层。c++和java用于构建中间应用层。如果资源足够,那么会选择c++开发,以求运行速度,否则会用java开发,以求开发速度。python在各方面都比java优秀,可谓次世代语言。可最受争议的是它的速度,纯python比java慢很多,以及背后没有商业支持,稳定性备受诟病。目前为止,python在商业层次上,主要作为一种胶水语言,粘合其他语言(主要是c/c++)的类库。在GNU领域,主要局限于小规模的应用和个人化应用。以及逆向工程(黑客)应用。
      为什么java在服务器端被大量应用,在客户端用的却比较少呢。难道服务器端用到的计算量反而少么。我认为这说明对比c++,java的速度还是可以接受的。无法被接受的是JRE平台,以及JRE平台启动时卡的那一会儿。我就曾经为此认为java写就的程式性能低下。
      python用户常常拿来说嘴的一点是:python并不慢,因为python运行时调用了大量c库,而c是很快的。反过来想想,这正反映了其胶水语言的事实,任何一种语言都可以调用c库,这么比较有价值么?假如一个库完全由python,那么它的运行效率...不说也罢。编程不能总是用别人的库啊。

    ----

    Python编程语言目前的使用中需要不断的学习。下面我们就详细的看看如何才能更好的进行相关知识的学习。最近我一直在看一个基于wxPython的GUI应用程序代码,大概45.5KLOC的左右,而且这还不包括它所用到的库(如Twisted)。

    代码是由那些对Python比较生疏的Java的开发者写的,所以它存在很严重的性能问题(如三十秒的启动时间)。在检查代码的时候,我发现他们写了很多在Java中能讲得通但是对Python编程语言来说去却是很难接受的东西。并不是因为“Python比Java慢”,而是因为在Python中有更方便的方法去完成同样的目标,甚至是在Java中不可能的事情。

    所以,令人难过的事就是这些家伙事倍功半,写的那些代码比本应合乎用Python编程语言实现的慢很多。下面,让我们来看一些例子:

    ◆Java中的静态方法不能翻译成Python的类方法。哦,当然,他多多少少也能产生同样的效果,但类方法的目的实际上是做一些通常在Java中甚至都不可能的事情(如继承一个非默认的默认函数)。Java静态方法惯用的翻译通常翻译成一个模块级的函数,而不是一个类方法或静态方法。(并且静态常量应该翻译成模块级常量.) 
    这不是性能上的问题,但是一个Python编程语言程序员如果想调用Foo.someMethod,他要是被迫采用像Java中Foo.Foo.someMethod的方式去做的话,那么他就会被逼疯的。有一点一定要注意:调用一个类方法需要一个额外的存储空间,而调用静态方法或函数就不需要这样.

    对了,还有就是这些Foo.Bar.Baz的属性链也不是自己就能数出来的.在Java中,这些带点的名称是有编译器来查找的,运行的时候并不会去考虑一共有多少.而在Python中,查找的过程是在运行时进行的,所以要包括每个点.(在Python中,要记住一点,"平铺的结构别嵌套的要好",尽管相对于从性能方面来说,可能它更多涉及的是"可读性"和"简单要比复杂好".)

    ◆要使用switch语句吗?Python编程语言将是一个哈希表,不是一堆if-then语句。要使用在Java中不是switch语句而且还有字符串参与了的一堆if-then语句吗?它将仍然是一个哈希表。CPython字典是用在我们所了解的领域中认为是最佳性能之一的哈希表来实现的。你自己所写的代码也不会比这个再好了,除非你是Guido、Tim Peters和Raymond Hettinger的私生子,而且还是遗传增强了的。

    ◆XML不是答案。它也不是一个问题。现在用正则表达式来解释Jamie Zawinski,“一些人,当他遇到一个问题的时候,就会想‘我知道,我要用XML.’那么他们就有两个问题了。”

    相对于在Java中来说这是个不同的情况,因为比起Java代码,XML是灵活而且有弹性的。但比起Python的代码来,XML就是一个船锚,一个累赘。在Python中,XML是用来协同工作的,而不是你的核心功能,因为你不需要那么做。在Java中,XML可能是你的救世主,因为它让你实现了特定领域的语言并且“不用编码”就提高你的应用程序的适应性。在Java中,避免编码是一个很大的优势,因为编码意味着重新编译。但在Python中,通常是,写代码比写XML更简单。还有就是Python处理代码要比处理XML快很多很多。(不仅仅是这个,你必须写XML处理代码,同时Python就已经为你写好了.)

    如果你是一个Java程序员,你并不能利用本能知觉来考虑你是否要在你的Python核心应用中使用XML作为一部分。如果你不是因为信息交互的原因去实现一个已经存在的XML标准或是建立某种输入、输出格式或者建立某种XML编辑器或处理工具,那么就不要这么做。根本不要去这么做。甚至连想都不要想。现在,丢掉那个XML模式然后把你的手解放出来吧!如果你的应用程序或者平台要被Python编程语言开发者使用,他们只会感谢你不要在他们的工作中添加使用XML的负担。

    (这里唯一的例外是如果你的客户(your target audience)确确实实因为某些原因而需要使用XML。就好像,他们拒绝学习Python但如果你使用XML他们就给你付钱,或者你打算给他们一个很棒的能编辑XML的GUI,还有就是这个XML的GUI是另一个人写的,同时你得到免费使用的权利。还有一些很少见的架构上的原因需要用到XML。相信我,它们不会应用到你的程序中去的。如果有疑问,对一个资深的Python开发员解释你的用例。或者,如果你脸皮厚而且不介意被人嘲笑的话,试试向一个Lisp程序解释你的程序为什么要用XML!)

    ◆Getter和setter是恶魔。我应该说它是恶魔,是魔鬼!Python编程语言对象不是Java Bean。不要写什么getter和setter,而是还把它们内置在“属性”里面。它直到你能证明你需要比一个简单访问复杂一点的功能时才有意义,要不然,不要写getter和setter。它们是CPU时间的浪费,更要紧的是,它们还是程序员宝贵时间的浪费。不仅仅对于写代码和测试的人,对于那些要阅读和理解它们的人也是。

    在Java中,你必须使用getter和setter,因为公共字段不允许你以后改变想法再去使用getter和setter。所以,在Java中你最好事先避开这些"家务杂事".在Python中,这样做很傻,因为你可以以一个普通特性开始并可以在任何时间改变你的想法,而不用影响到这个类的任何客户。所以不要写getter和setter方法。

    ◆代码重复在Java中通常来说就是一场不可避免的灾祸,你必须经常反复地写同一个方法而只有一点点的变化(通常是这是因为静态类型约束)。在Python中这样做是没有必要的也是不值得的(除了极少数一些特定的场合需要内联一些要求性能的函数)。如果你发现自己一遍一遍在写同样的代码而且变化很少,你就需要去学一下闭包。他们实际不并是那么可怕。

     

    这就是你要做的。你写了一个包含了函数的函数。这里内部的函数就是你要一遍遍写的函数的模版,但是在里面加入了针对不同情况的函数要使用变量。外部的函数需要刚刚提高的那种变量作为参数,并且将内部的函数作为结果返回。然后,每次你要写另一种略微不同的函数的时候,你只要调用这个外部的函数,并且把返回值赋给你要让“重复”函数出现的名字。现在,如果你需要改变这个工作方式,你只需要改变一个地方:这个模版。

    在我所看过的应用程序/平台中,只有一个很微不足道的程序使用了这个技术,它去掉了数百行重负的代码。实际上,因为开发者使用了特别的样板文件来为这个平台开发插件,所以这会节省很多很多第三方开发人员的代码,同时也使那些程序员要学习的东西变得简单了。

    这只是Java->Python编程语言思维方式转变的冰山一角而已,现在我能正确的转变而不用去钻研程序的细节。本质上,如果你曾经用过一段时间Java,而且对Python比较陌生,那么你不要太相信自己的本能。你的本能已经被Java调节,而不是Python。向后退一步来说,最重要的是不要再写这么多代码了。

    为了这样做,让自己觉得更加需要Python。假装好像Python是可以做任何你想做的魔棒,而你无须出一点力。问一下,“Python怎样解决我的问题?”还有“Python语言的哪个特点和我的问题最相似?”如果对于你需要的东西其实已经有了某种固定形式,那么你绝对会感到惊讶的。事实上,这种现象实在是太普遍了,甚至即使在很有经验的Python程序员中也会出现,以至于Python社区中给这种现象起了个名字。我们称之为“GUIDO的时间机器”,因为在我们自己还没有掌握它之前,通常看上去要得到我们所需要的东西好像那是唯一的方法。

    所以,如果你在使用Python编程语言时候不能感到比使用Java要至少多出10倍的生产力话,你就最好做一下改动,你是不是忘记使用time machine!(chances are good that you've been forgetting to use the time machine)(同时如果你还怀念你的Java IDE,你可以这样想:因为你写的Python程序比他所需要的要复杂得多.)

    What Doesn't Kill Me Makes Me Stronger
    展开全文
  • 对比java和python对比

    万次阅读 2017-11-09 14:23:57
    python远远简单于java。  2.开发速度。Python远优于java  3.运行速度。java远优于标准python,pypy和cython可以追赶java,但是两者都没有成熟到可以做项目的程度。  4.可用资源。java一抓一大把,python很少很...
    1.难易度而言。python远远简单于java。
    
      2.开发速度。Python远优于java
      3.运行速度。java远优于标准python,pypy和cython可以追赶java,但是两者都没有成熟到可以做项目的程度。
      4.可用资源。java一抓一大把,python很少很少,尤其是中文资源。
      5.稳定程度。python3和2不兼容,造成了一定程度上的混乱以及大批类库失效。java由于有企业在背后支持所以稳定的多。
      6.是否开源。python从开始就是完全开源的。Java由sun开发,但现在有GUN的Openjdk可用,所以不用担心。
      7.编译还是解释。两者都是解释型。
      我理解,C好比手动挡车(编译型语言),java和python(解释型语言)好比自动档车。跑的最快的车都是手动档,但是对开不好的人来说,开自动档反而更快些。
      Kno有一篇文章谈到选择编程语言,“先确定你的需求”,不要由语言的简单还是复杂去觉定。只有能够编写你真正认为有用的程式,才能获得满足感,学习才能继续。
      那么java和python分别适用于什么样的环境呢。由sourceforge.net可以看出:
      最著名,久经考验的普通应用程序,基本都是c++写的。例如emule,7-zip,WinSCP,FileZilla等等等。
      一部分由java开发,例如最有名的OpenOffice。
      python写的很少,如Pidgin,FireBird。
      开发语言(有多少个程式由此语言开发)的排行如下:
      # Java46,202
      # C++36,895
      # PHP30,048
      # C28,075
      # C#13,476
      # Python13,379
      # JavaScript11,285
      # Perl9,216
      # Unix Shell3,869
      # Delphi/Kylix3,548
      # Visual Basic3,186

      # Visual Basic .NET

    作者:find goo
    链接:https://www.zhihu.com/question/20491745/answer/100741761
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    区别
    一、python虚拟机没有java强,java虚拟机是java的核心,python的核心是可以很方便地使用c语言函数或c++库。

    二、python是全动态性的,可以在运行时自己修改自己的代码,java只能通过变通方法实现。python的变量是动态的,而java的变量是静态的,需要事先声明,所以java ide的代码提示功能优于python ide。

    三,python的产生几十年了,几十年前面向过程是主流,所以用python有好多程序用的是面向过程设计方法,很多概念从c语言过来的,class在python中是后加入的,而java是为了实现没有指针的c++(当年com组件用的引用记数,java用的虚拟机),主要采用面向对象的设计方法,很多概念是oop的概念。面向过程,相对简洁直观,但容易设计出面条程序,面向对象,相对抽象优雅,但容易过度抽象。

    四,在实际使用的python入门简单,但要学会用python干活,需要再学习python各种库,pyhton的强大在于库,为什么python的库强大,原因是python的库可以用python,c语言,c++等设计,再提供给python使用,所以无论gpu运行,神经网络,智能算法,数据分析,图像处理,科学计算,各式各样的库在等着你用。而java没有python那么多的开源库,很多库是商业公司内部使用,或发布出来只是一个jar包,看不到原始代码。python虚拟机因为编译性没有java的支持的好(或者说故意这么设计的),一般直接使用源码(linux),或源码简单打个包(如pyexe)。

    五、python有很多虚拟机实现,如cython,Pyston,pypy,jython, IronPython等等,适合用于业务语言,或插件语言,或面向领域语言,而java因为虚拟机巨大,很少用于插件语言,发布也不方便。

    六、java主要用于商业逻辑强的领域,如商城系统,erp,oa,金融,保险等传统数据库事务领域,通过类似ssh框架事务代码,对商业数据库,如oralce,db2,sql server等支持较好,软件工程理念较强,适合软件工程式的多人开发模式。python主要用于web数据分析,科学计算,金融分析,信号分析,图像算法,数学计算,统计分析,算法建模,服务器运维,自动化操作,快速开发理念强,适合快速开发团队或个人敏捷模式。

    七、java的商业化公司支持多,如sap,oracle,ibm等,有商业化的容器,中间件,企业框架ejb。python的开源组织支持多,如qt,linux,google,很多开源程序都支持python, 如pyqt,redis,spark等。

    八、python用途最多的是脚本,java用途最多的是web,pyhotn是胶水,可以把各类不相关的东西粘在一起用,java是基佬,可以通过软件工程组成几百个人的团队和你pk,商业化气息重。不过我认为还是python强大,因为可以方便调用c或c++的库,但软件工程和商业化运作没有java好,适合快捷开发。

    九,关于钱。

    如果你想写程序卖软件用java,可用上ibm服务器,上oracle数据库,上EMC存储,价格高,商业采购公司喜欢这种高大上。如果你要直接用程序生成金钱用python,python可以实现宽客金融,数据回测,炒股,炒期权,炒黄金,炒比特币,对冲套利,统计套利,有很多开源库,数据分析库,机器学习库可以参考。

    十、java和python,都可以运行于linux操作系统,但很多linux可以原生支持python,java需要自行安装。java和python强于c#的原因大于支持linux,支持osx,支持unix,支持arm。java和python比c++受欢迎的原因在于不需要指针。

    十一、对于移动互联网,python只能通过运行库运行于安卓或ios,java原生支持安卓开发,但不能用ios中。

    十二、对于大数据,hadoop用java开的, spark用Scala开发,用python调用spark再分析更方便


    大神不会告诉你的Java与Python的区别
    http://www.codesec.net/view/517408.html


    对比java和python对比
    http://www.cnblogs.com/kungfupanda/p/4601947.html


    Java 和 Python 有哪些区别?
    https://www.zhihu.com/question/20491745


    展开全文
  • 对比Java.nio 和 Java.io

    千次阅读 2012-12-14 12:14:47
    对比Java.nio 和 Java.io from http://www.importnew.com/1178.html 原作者:Davide Pisano,编译:ImportNew - 储晓颖 本文并非Java.io或Java.nio的使用手册,也不是如何使用Java.io与Java.nio的技术...

    对比Java.nio 和 Java.io

    原作者:Davide Pisano,编译:ImportNew - 储晓颖

    本文并非Java.io或Java.nio的使用手册,也不是如何使用Java.io与Java.nio的技术文档。这里只是尝试比较这两个包,用最简单的方式突出它们的区别和各自的特性。Java.nio提出了新的流(stream)通讯概念并且加入了新的缓冲、文件流以及socket(套接字)特性。

    java.io 概览

    这个包通过数据流和序列化机制来实现系统输入和输出。并且支持多种类型的数据流,包括简单的字节、原生数据类型、地区字符以及对象。流是一个数据的序列:一个程序使用输入流从一个源头读取数据;

    另一个程序使用输出流写入并发送数据到目的地。

    这些程序都使用字节流来执行字节的输入和输出。所有涉及字节流的类都是继承自InputStream和OutputStream。

    关于 InputStream 和 OutputStream

    执行InputStream和OutputStream的操作一般都意味着不断循环的将字节逐一从输入流读出或写入到输出流。你可以使用缓冲I/O流来降低I/O成本(凡是I/O请求都经常触发磁盘访问、网络动作或其他一些成本昂贵的操作)。缓冲输入流则是从缓冲的内存区域读取数据,只有缓冲读完才会调用native input API(不同操作系统提供的本地输入流API——译者注)。同样的,缓冲输出流也将数据写入缓冲,只有缓冲写满才会调用native output API。这些带缓冲的API很好的封装了未缓冲的流操作: BufferedInputStream 和 BufferedOutputStream.

    File I/O

    上面一节主要是针对数据流,它提供一种数据读取和写入的简单模型。真实的数据流其实是涉及种类繁多的数据源和目的地,包括磁盘文件。但是,数据流并不支持所有磁盘文件操作。下面的链接介绍了非数据流的文件I/O:

    • File 类可以编写平台无关的检查和处理文件、目录的代码。

    java.net socket

    两个在网络上运行的程序之间会建立双向通讯的链接,socket就是其中一个端点。Socket相关的类代表着客户端程序和服务端程序之间的连接。java.net包提供了两个类:Socket和ServerSocket。它们分别实现了连接的客户端和服务端。

    客户端知道服务端运行机器的域名,以及服务器监听的端口,它尝试连接到服务器,如果一切正常,服务器接受并建立连接。当接受连接时,服务器在监听端口上绑定一个新的socket,并且通知远程端点设置客户端的地址和端口。之所以要建立一个新的socket是为了处理已连接客户端请求的同时还能继续监听原始socket上的连接请求。

    服务器使用阻塞模式等待客户端连接:serverSocket.accept()是一个阻塞指令,当服务器等待接受连接时主线程不能做任何其他操作。由于这个原因,服务器想要达到多任务处理就只能通过实现一个多线程服务器:每当新建一个socket时就必须为它创建一个新线程。

    NIO API

    I/O性能经常是一个现代应用的痛处。操作系统持续优化改进I/O性能,JVM也提供了一套运行环境帮助Java程序员规避了绝大多数操作系统I/O之间的差异。这些都让I/O相关编码更加高效和简单,但是却隐藏了操作系统的功能特性。想要增强I/O性能,其实你可以通过一些特殊的编码直接访问操作系统的底层功能,但是这并不是最佳解决方案——你的代码将必须依赖某个操作系统。 Java.nio包应运而生来解决这个难题,它提供了高性能的I/O特性,并支持当今大多数常用的商用操作系统。

    JDK1.4的NIO包介绍了一系列新的I/O操作的抽象概念。

    java.nio 概览

    Java.nio这个新增的包实现了Java平台新的 I/O API。NIO API 包含如下特性:

    • 原生类型数据缓冲
    • 字符集的编码器和解码器
    • 基于Perl风格正则表达式的模式匹配
    • 通道(Channel),一种新的原生I/O抽象概念
    • 支持锁和内存映射的文件接口
    • 通过多路复用、非阻塞的I/O能力实现可伸缩的服务器架构

    在SUN(现Oracle)的站点上可以找到java.nio的详细技术文档。这里我将解释一些nio的概念,并且和老的java.io库做下比较。建议不要把java.nio当作java.io的替代品,即使它是java.io的“扩展”。Nio的诞生导致了整个I/O类和接口的重新修订(详情请看)。
    NIO中一个最重要的概念是在非阻塞模式下运行,与传统Java I/O类库完全不同。什么是非阻塞模式?

    Non blocking mode 非阻塞模式

    一个I/O流的字节必须序列化的访问。各种设备,打印机端口、网络连接等都是常见的例子。
    数据流通常比阻塞式设备慢,而且经常断断续续。大多数操作系统允许将数据流设置为非阻塞模式,允许进程检查是否流上是否有可用数据,即使没有也不会导致进程阻塞。这种机制能让进程在输入流空闲等待时执行其他逻辑,但是数据到达时又能及时处理。操作系统能够观察一堆的数据流并且指示其中哪些处于可用状态。通过观察这些可用状态,一个进程可以采用常用的编码和单个线程就能同时处理多个活动的数据流。这在网络服务器处理大量网络连接时被广泛使用。

    Buffers 缓冲

    从简单的入手,首先的改进是一系列java.io包中新建的缓冲类。这些缓冲提供了一个可以在内存容器中存储一堆原生类型数据的机制。一个缓冲对象是一个固定容量的容器,容器中的数据可以被读写。

    所有的缓冲都是可读的,但并非都是可写的。每个缓冲类都实现了isReadOnly()方法来表示缓冲内容是否允许被修改。

    Channels

    缓冲需要配合Channel来使用。Channel是I/O传输的入口,缓冲则是数据传输的源头或目的地。在写入时,你想发送的数据首先被放入缓冲,接着被传递至一个Channel;在读取时,Channel负责接收数据,然后寄存至你提供的缓冲中。(比如在网络传输时的过程:用户数据——>发送端缓冲——>发送端Channel——>网络传输——>接收端Channel——>接收端缓冲——>用户数据,译者注)

    Channel就像一个管道一样,将数据在管道两端的字节缓冲之间进行高效率的传输。它就像是一个网关,通过它可以用最小的成本来访问操作系统本地的I/O服务,而缓冲则是在两端内部的端点,Channel使用它来发送和接收数据。

    Channel能在非阻塞模式下运行。一个非阻塞模式下的Channel不会让调用线程睡眠。请求的操作要么立刻完成、要么返回一个结果告知什么都没做。只有面向数据流的Channel,比如socket,能够在非阻塞模式下运行。在java.nio中的Channel包括FileChannel、ServerSocketChannel以及SocketChannel;这些都是为文件和socket管理所提供的特定的Channel。

    FileChannel

    FileChannel是可读可写的Channel,它必须阻塞,不能用在非阻塞模式中。面向数据流I/O的非阻塞风格并不适合面向文件的操作,因为文件I/O有本质上的区别。

    FileChannel对象不能被直接创建。一个FileChannel实例只能通过在打开的文件对象(RandomAccessFile、FileInputStream、或FileOutputStream)上调用getChannel()得到。GetChannel()方法返回一个连接到相同文件的FileChannel对象,与文件对象拥有相同的访问权限。FileChannel对象是线程安全的。多线程能够并发的调用同一个实例上的方法而不会导致任何问题,但是并非所有操作是支持多线程的。影响Channel位置或者文件大小的操作必须是单线程的。

    使用FileChannel,可以让拷贝等操作变成Channel到Channel的传输(transferTo()和transferFrom()方法),而且读写操作更易于使用缓冲。

    SocketChannel

    SocketChannel与FileChannel不同:新的Socket Channel能在非阻塞模式下运行并且是可选择的。不再需要为每个socket连接指派线程了。使用新的NIO类,一个或多个线程能管理成百上千个活动的socket连接,只用到很小甚至0的性能损失。使用Selector对象可以选择可用的Socket Channel。

    有3个Socket Channel类型:SocketChannel, ServerSocketChannel, 以及 DatagramChannel; SocketChannel和DatagramChannel是可读可写的,ServerSocketChannel 监听到来的连接,并且创建新的SocketChannel 对象。所有这些SocketChannel初始化时会创建一个同等的socket对象(java.net sockets)。这个同等的socket能从Channel对象上调用socket()方法获取。每个Socket Channel (in java.nio.channels)对象拥有一个相关的java.net.socket对象,反之并非所有的socket对象拥有相关的Channel对象。如果你使用传统方式创建一个socket对象,直接初始化它,它将不会拥有一个相关的Channel对象,它的getChannel()方法会返回null。

    Socket Channel能在非阻塞模式下运行。传统Java Socket阻塞的本性曾经是影响Java应用可伸缩性的罪魁祸首之一。而基于非阻塞I/O则构建了很多复杂巧妙的、高性能的应用。设置或重置Channel的阻塞模式很简单,只要调用configureBlocking()即可。

    非阻塞socket常在服务器端使用因为它能让同时管理多个socket变得简单。

    Selector 选择器

    选择器(Selector)提供了挑选可用状态Channel的能力,从而实现多路复用的I/O。我下面的例子将很好的解释选择器的优势:

    设想你在一个火车站(non-selector,非选择器场景),有3个平台 (channels), 每个平台都有火车到达(buffer,缓冲)。每个平台上都有个管理员管理着到达的列车(worker thread,工作线程)。这是非选择器的场景。现在设想下选择器场景。有3个平台(channels),每个平台会有火车到达(缓冲),每个平台都有个指示器(比如一个响铃)指示着“火车到达”(selection key)。在这个场景下只有一个管理员就可以管理所有的3个平台。他只需查看指示器(selector.select())来判断是否有火车到达然后去处理一下到达的列车。

    理解selector场景的优势很简单:一个单线程就可以实现多重任务处理的应用。除此之外,使用非阻塞选择器还能得到更多好处!设想火车管理员看着指示器时:他可以等待新的列车到达而不做其他事(使用selector.select()的阻塞模式);也可以在等待新的列车到达时(非阻塞模式使用selector.selectNow())去卖车票,这样selector就会返回null让线程执行其他代码逻辑。

    IO vs. NIO

    NIO使得I/O比传统I/O更加高效。在一个I/O操作占很高比例的程序中,想想看会有什么不同。比如,如果一个应用需要使用socket拷贝文件或者传输字节,使用NIO可能会得到更快的性能,因为它比I/O的API更接近操作系统。随着数据量的增大,性能提升将更可观。除了io API里,NIO还为数据流操作提供了其他的功能特性。但是,不可能用NIO取代IO,因为NIO的API是基于java.io之上扩展的功能。NIO通过扩展本地的IO API,为广大开发者使用更加强大的方式操作数据流带来了新的可能性。

    英文原文:Java.nio vs Java.io,编译:ImportNew - 储晓颖

    译文链接:http://www.importnew.com/1178.html

    【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

    相关文章

    展开全文
  • 爬虫 对比Java和Python

    千次阅读 2020-06-02 17:18:15
    网络爬虫 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种...java:webmagic,http://webmagic.io/docs/zh/ python:scrapy,http://blog.csdn.net/sunnyxiaohu/article/detai.

    网络爬虫

    网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。通俗讲 就是将你在网页上看到的信息通过代码程序自动获取到本地的过程。

     

    常用框架:

    java:webmagic,http://webmagic.io/docs/zh/

    python:scrapy,http://blog.csdn.net/sunnyxiaohu/article/details/50787430

     

    python 

    网络功能强大,模拟登陆、解析javascript,短处是网页解析 
    python写起程序来真的很便捷,著名的python爬虫有scrapy等

    python流行起来,从某程序员聚集的网站来看 python爬虫教程满天飞。著名的scrapy便是python开发的。 
    python开发爬虫非常灵活,最适合一次性采集数据,写几行代码就可以把初步结构化的数据库入库。urllib、requests、beautifulsoup等模块可以轻松构建一个基本的采集程序。 
    使用python时会遇到中文乱码问题,window开发 Linux 部署乱码问题会让你感觉更棘手,最好统一开发部署环境,有钱公司用macbookpro,没钱装个ubuntu。

    python遇到复杂的js是表现和java差不多,你都会想自己实现一个浏览器,phantomjs 不够稳定,中介再加上一层selenium 写写demo还可以

    java

    java有很多解析器,对网页的解析支持很好,缺点是网络部分 
    java开源爬虫非常多,著名的如 nutch 国内有webmagic 
    java优秀的解析器有htmlparser、jsoup

     

    对于一般性的需求无论java还是python都可以胜任。

    如需要模拟登陆、对抗防采集选择python更方便些,如果需要处理复杂的网页,解析网页内容生成结构化数据或者对网页内容精细的解析则可以选择java。

     

    展开全文
  • java离线人脸对比Java人脸识别

    千次阅读 2018-10-18 19:43:48
    demo基于Java+flash+ajax sdk开发包:放入window/system32目录下 应用层:ZZFaceAapp.jar依赖jna-4.4.0.jar 方法调用入口: 数据类型:0照片,1视频流 照片(视频)1:照片一路径 照片2:照片二路劲 ...
  • beyond compare 对比java class 文件

    千次阅读 2018-02-26 09:47:37
    使用beyond compare 扩展插件可以直接对比编译的java class 文件 而不会显示一大堆乱码首先 选择下面的 BC3 EXTRASAdditional file format downloads for version 3 具体下载地址 windows下的官网下载地址:...
  • 蓝桥试题 基础练习 字符串对比 JAVA

    千次阅读 2020-04-02 16:20:55
    输入格式 包括两行,每行都是一个字符串 输出格式 仅有一个数字,表明这两个字符串的关系编号 样例输入 BEIjing beiJing 样例输出 3 思路:按着题目要求 一步一步的试就可以了… import java.util.Scanner;...
  • 对比Java,Kotlin的优点和缺点

    千次阅读 2019-05-04 09:22:25
    Kotlin近来发展迅速,使得许多Java开发者转向了Kotlin,那两种语言到底对比如何呢? 下面Kotlin的优点,大部分已经在《为什么Kotlin比Java能大量减少代码》介绍了,但是为了本文的完整性,再次完整展示. Kotlin优点 1. ...
  • C++中this关键字的用法,对比Java

    千次阅读 2018-01-02 15:51:06
    我们先来看看C++里面的this关键字的用法: ... Java的关键字this代表当前的一个引用,通过this的使用,可以方便的访问当前对象的属性值,也可以用在构造方法的重载中。 在Java中,方法内局部变量名、方法的参数可
  • Beyond Compare是一套由Scooter Software...在打开的对比窗口,左边选择“本地”,右边选择“远程”,则可以进行对比,有冲突的文件显示红色,新增的文件显示蓝色。双击差异文件可以详细查看。
  •  JAVA传统的多线程主要解决的问题:  1、运行于多核CPU上,各线程可分布于CPU的各个核心,让程序真正的并发  2、因为外设(IO外设)的速度不匹配,导致线程阻塞。所以需要多线程切换来让阻塞的线程让出CPU,让...
  • java需要先学好java的语法和熟悉一些核心的类库,懂得面向对象的程序设计方法。所以java不如php好学。 Java首先要编译成字节码.class文件,然后在java虚拟机上解释执行。Java的web开发首先最容易想到的就是JSP(现
  • JAVA:使用super调用父类的读域函数getAge() Person.java package test; public class Person { public Person(int age) { this.aAge = age; } public int getAge() { return aAge; } public void ...
  • java文件对比工具

    2018-03-27 17:40:21
    文件对比工具 JAVA JAVA文件对比 工具 对比工具 文件对比工具 JAVA JAVA文件对比 工具 对比工具 文件对比工具 JAVA JAVA文件对比 工具 对比工具
  • java对比工具

    2018-09-16 11:45:04
    java对比工具,在开发时遇到一些类文件或者java文件想对比不同,可以自动导入,超级好用
  • java和python对比

    千次阅读 2017-08-26 15:44:05
    对比java和python  1.难易度而言。python远远简单于java。  2.开发速度。Python远优于java  3.运行速度。java远优于标准python,pypy和cython可以追赶java,但是两者都没有成熟到可以做项目的程度。  4.可用资源...
  • Java数组转List的三种方式及对比

    万次阅读 多人点赞 2018-03-18 00:10:04
    本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。
  • java文件对比软件

    2011-03-23 10:46:07
    java文件对比软件 java文件对比软件 java文件对比软件
  • Java遍历Map效率对比

    千次阅读 2019-03-25 21:04:11
    Java遍历Map效率对比 Java 中Map容器的遍历有多种方式,但是不同的方式效率会大有不同,以前没有注意这些细节,随意使用遍历方式在本地可能没有什么影响,但是在项目在高频使用需要特别注意,尽量使用高效的方式。 ...
  • Java文件对比工具

    2018-11-06 18:05:36
    用于Java等文件对比的工具,非常好用能够比对两个文件之间差异,并通过明显的红色标记进行标记,很实用,对于开发人员来讲很适合,,所以推介给大家.
  • J2EE DotNET 对比 .net java 平台
  • java时间对比

    千次阅读 2017-11-28 14:19:14
    java时间对比,后续不断更新public static void main(String[] args) throws ParseException { //Date date = new Date(); //Timestamp nousedate = new Timestamp(date.getTime()); //System.out.print
  • Java 11 对比Java 8 做了哪些改动,哪些优化

    千次阅读 热门讨论 2021-06-11 18:17:20
    文章目录Java 11 对比Java 8 做了哪些改动,哪些优化传送门`Process` 新增了关键字 var`Process` 自带了 HTTP Client 模块`Process` String 处理增强 , 新增了一些常用方法`Process` InputStream 增强`Process` ...
  • java文本相似度对比

    2019-01-14 15:05:07
    使用java调用HanLP分词器实现两个文本相似度对比,可以很快对比出百分率(1=100%)
  • java持久层框架对比

    2012-02-10 15:07:52
    java持久层框架对比
  • java二行数据对比

    2013-10-27 14:57:17
    java二行数据对比,重数据库获取数据,到java这边编历第一行和第二数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 396,671
精华内容 158,668
关键字:

对比java

java 订阅