javanio文件上传
㈠ java nio bytebuffer文件读写问题
JDK1.4以后就提供java.nio的包,nio主要提供字节与字符的映射、内存映射文件和文件加锁机制
其中内存映射文件在读取大文件时可能会用上,因为内存映射不是直接把文件加载到JVM内存空间
而是借用操作系统对文件的读取,这经历了由当前Java态进入到操作系统内核态,再由操作系统读取文件,
并返回数据到当前Java态的过程。由Java态进入操作系统内核态离不开nio包中两个重要的类
FileChannel 和 ByteBuffer。FileChannel表示文件通道,可以从FileInputStream、FileOutputStream
以及RandomAccessFile对象获取文件通道,你可以从文件通道直接读取文件,也可以使用“内存映射”
即使用通道,将文件内存映射到ByteBuffer,可以映射一部分内容,也可以映射全部内容,使用内存映射
能大幅提高我们操作大文件的速度
FileChannel 和 ByteBuffer文件读取
[java] view plain
package nio;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
/**
*
* Channel类似与流,数据可以从Channel读取到Buffer,也可以从Buffer写入到Channel
* 但通道和流还是有区别,比如流只能是单向读或写,而通道可以异步读写
*
* @author yli
*/
public class FileChannelTest {
㈡ 一个合格的Java开发工程师应该具备哪些技能
.CoreJava,就是Java基础、JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看,对使用频繁的类,比如String,集合类(List,Map,Set)等数据结构要知道它们的实现,不同的集合类有什么区别,然后才能知道在一个具体的场合下使用哪个集合类更适合、更高效,这些内容直接看源代码就OK了2.多线程并发编程,现在并发几乎是写服务端程序必须的技术,那对Java中的多线程就要有足够的熟悉,包括对象锁机制、synchronized关键字,concurrent包都要非常熟悉,这部分推荐你看看《Java并发编程实践》这本书,讲解的很详细3.I/O,Socket编程,首先要熟悉Java中Socket编程,以及I/O包,再深入下去就是JavaNIO,再深入下去是操作系统底层的Socket实现,了解Windows和Linux中是怎么实现socket的4.JVM的一些知识,不需要熟悉,但是需要了解,这是Java的本质,可以说是Java的母体,了解之后眼界会更宽阔,比如Java内存模型(会对理解Java锁、多线程有帮助)、字节码、JVM的模型、各种垃圾收集器以及选择、JVM的执行参数(优化JVM)等等,这些知识在《深入Java虚拟机》这本书中都有详尽的解释,或者去oracle网站上查看具体版本的JVM规范.5.一些常用的设计模式,比如单例、模板方法、代理、适配器等等,以及在CoreJava和一些Java框架里的具体场景的实现,这个可能需要慢慢积累,先了解有哪些使用场景,见得多了,自己就自然而然会去用。6.常用数据库(Oracle、MySQL等)、SQL语句以及一般的优化7.JavaWeb开发的框架,比如Spring、iBatis等框架,同样他们的原理才是最重要的,至少要知道他们的大致原理。8.其他一些有名的用的比较多的开源框架和包,Netty网络框架,Apachecommon的N多包,Google的Guava等等,也可以经常去Github上找一些代码看看
㈢ Java中IO与NIO的区别和使用场景
在java2以前,传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大。java5以后使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程来为任意数量的连接服务。由于线程数量小于连接数量,所以每个线程进行IO操作时就不能阻塞,如果阻塞的话,有些连接就得不到处理,NIO提供了这种非阻塞的能力。
NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。
反应器(Reactor):用于事件多路分离和分派的体系结构模式
通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。
一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。
另一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。
传统的阻塞式IO,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。
非阻塞式IO,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。
为什么会这样,下面就对他们做进一步细致具体的分析:
首先,我们来分析传统阻塞式IO的瓶颈在哪里。在连接数不多的情况下,传统IO编写容易方便使用。但是随着连接数的增多,问题传统IO就不行了。因为前面说过,传统IO处理每个连接都要消耗一个线程,而程序的效率当线程数不多时是随着线程数的增加而增加,但是到一定的数量之后,是随着线程数的增加而减少。这里我们得出结论,传统阻塞式IO的瓶颈在于不能处理过多的连接。
然后,非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞IO处理连接的线程数和连接数没有联系,也就是说处理 10000个连接非阻塞IO不需要10000个线程,你可以用1000个也可以用2000个线程来处理。因为非阻塞IO处理连接是异步的。当某个链接发送请求到服务器,服务器把这个连接请求当作一个请求"事件",并把这个"事件"分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。
所谓阻塞式IO流,就是指在从数据流当中读写数据的的时候,阻塞当前线程,直到IO流可以
重新使用为止,你也可以使用流的avaliableBytes()函数看看当前流当中有多少字节可以读取,这样
就不会再阻塞了。
㈣ java学习一般步骤有哪些
首先是Java技能的核心和基础JavaSE,这一阶段会接触到Java基础语法、面向对象编程思维、Java常用API、多线程并发编程、数据结构/集合结构、IO/网络编程/反射/设计模式。这一阶段往往也是最重要的,后边许多知识和结构的使用都是根据这一基础来的。学完这一部分,做一些简略的桌面使用程序设计没有问题。
接下来Java的进阶课程中,要用到的便是数据库(MySQL)和JDBC。在之后,要学习到的是JavaWeb开发技能。学完可以具有开发个人网站和企业网站的知识技能。
最后,接下来便是Java课程最重要的部分把学到的Java技术知识应用到实战项目了,一般实战项目会占整个课程的少半时间,从浅入深,会接触到大小型企业内各种真实实战项目。 比方内容办理体系(CMS)、智能商贸体系、盛行结构使用、B2C/商城项目等。完结这些项目,你对市面上大多数web使用开发、办理体系开发、运用前沿技能开发都得心应手。
java学习路线图:
㈤ netty 和 java nio 的区别
Java NIO框架MINA用netty性能和链接数、并发等压力测试参数好于mina。
NIO弥补了原来的I/O的不足,它再标准java代码中提供了高速和面向块的I/O
原力的I/O库与NIO最重要的区别是数据打包和传输方式的不同,原来的I/O以流的方式处理数据,而NIO以块的方式处理数据;
NIO以通道channel和缓冲区Buffer为基础来实现面向块的IO数据处理,MINA是开源的。
JavaNIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。
Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。
Java NIO出现不只是一个技术性能的提高,会发现网络上到处在介绍它,因为它具有里程碑意义,从JDK1.4开始,Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。
如果至今还是在怀疑Java的性能,说明思想和观念已经完全落伍了,Java一两年就应该用新的名词来定义。从JDK1.5开始又要提供关于线程、并发等新性能的支持,Java应用在游戏等适时领域方面的机会已经成熟,Java在稳定自己中间件地位后,开始蚕食传统C的领域。
原理:
NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生。比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。在使用上,也在分两个方向,一个是线程处理,一个是用非线程,后者比较简单。
㈥ 想学java,高中学历,出来们找到工作吗
好找工作吗?回答都会比较尴尬,因为这个牵涉太广,一要看你需要学习的程度,二要看你学习的能力。任何东西都是分等级的,上学还分小学中学大学呢。学习任何东西还得看学习能力,(这关乎天赋和兴趣,我们就不细分了),不然为何有各种事物都有等级,学历什么有各种等级……那Java好学吗?说来说去其实还讲到一个学习阶段的问题。
Java的一个学习阶段
第一阶段
计算机基础知识,常用快捷键和常用DOS命令。Java语言发展史,Java开发环境的搭建, 体验Java程序的开发,Java程序的执行过程,初学者常见问题,环境变量path和classpath的设置,Java反编译工具介绍。计算机常用进 制二、八、十六的介绍,以及它们与十进制之间的相互转化,有符号数据表示法,原码,反码,补码。
Java语法格式,关键字,标识符,注释,数据类型,常量和变量,变量的作用域,数据类型转换,运算符,表达式。程序流程控制语句以及其应用场景,函数和函数的重载,数组及常见操作。
项目练习与阶段测试
水仙花,裴波纳契数列,数据加密等经典问题的详解讲解。
第二阶段
面向对象思想,类的概述,对象的本质,类与对象的关系,以及在实际开发中如何应用面向对象的思想解决问题。
如何设计类,设计类的基本原则,对象的应用。类的细节:成员变量,构造方法,成员方法,private关键字,this关键字,static关键字,super关键字,final关键字。匿名对象,内部类及匿名内部类的使用。Javadoc命令制作API。
面向对象的三大特性:封装、继承和多态,以及相应的Java实现。封装的优点及缺点剖析,对象 的实例化过程。继承的优点及缺点剖析,子类对象的实例化过程,方法的重写。多态的优点及缺点剖析,向上转型和向下转型问题。抽象类和接口的优点及缺点剖 析,抽象类和接口的区别,以及抽象类和接口在多态中的应用。如果你想学习Java可来这个裙,首先是二二零,中间是一四二,最后是九零六,里面有大量的学习资料可以下载。
包的作用及带包程序的编译和运行,不同包下类的访问,导包的作用及使用。四种访问权限修饰符的区别及常见使用。
项目练习与阶段测试
常用设计模式的讲解:单例设计模式,简单工厂模式和工厂方法模式,模板设计模式。帮助同学们更好的理解面向对象思想。
第三阶段
Eclipse的安装和使用。JavaAPI介绍, API中常用类的讲解:String和StringBuffer,Math和Random类,基本数据类型包装类,BigInteger和 BigDecimal类,System和Runtime类,Date和DateFomat类,以及Calendar类,Scanner和Timer等。
Java集合体系结构,Collection,Iterator,List,ListIterator,ArrayList,Vector,Enumeration,LinkedList, Stack,Set,Hashset,TreeSet,LinkedHashSet,Map,HashMap,TreeMap,LinkedHashMap,Hashtable 等常用集合接口和集合类常见操作。集合的数据结构详细分析,泛型在集合中的使用。
异常:异常的由来,异常体系,异常处理方式,throws和throw关键字的使用,多重捕获Multi-catch,如何使用自定义异常等。
IO概念,File类,字节流InputStream和OutputStream,字符流 Reader和Writer,以及相应实现类,IO性能分析,字节和字符的转化流,包装流的概念,以及常用包装类,装饰设计模式的讲解。 Properties的使用。计算机编码问题的分析和讲解。Java NIO包下IO流的使用。
项目练习与阶段测试
递归算法,装饰设计模式,泛型的使用,增强for循环,可变参数,静态导入等特性的详细讲解。
第四阶段
多线程的概念,如何在程序中创建多线程(Thread、Runnable),线程安全问题,线程的同步,死锁问题,线程间通信问题,生产者消费者问题讲解,线程组和线程池问题,以及线程相关类介绍。
Java图形用户接口编程(AWT、Swing),图形界面体系,事件监听机制以及常用界面组件的用法。
Java网络编程,网络通信模型,网络通信三大要素,以及其相应的Java实现。 DatagramSocket,DatagramPacket,ServerSocket,Socket编程。使用UDP协议完成一个简易版聊天室程序, 使用TCP协议实现文件上传服务器,以及一个服务器如何对应多个客户端的情况。
Java正则表达式的使用,String类,Pattern和Matcher类对正则表达式的支持。
Java的高级特性:类加载器,反射及代理。
项目练习与阶段测试
常见经典问题再现:生产者和消费者问题,聊天室的编写,文件上传服务器,对文件中邮箱的抓取,类加载器,反射及代理。