`
lxy2330
  • 浏览: 468511 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java学习之IO与NIO篇

 
阅读更多
Java的IO相较于其他语言,感觉是比较抽象和复杂的,当然等你理解了它并且熟练了,它的强大性就马上体现出来了。其实本来只是想写nio的,把io也顺带理一下吧。

Java的io最重要的一个概念就是流,就像一个水管插在文件和终端之间,每个字节都是一滴水,按顺序单方向地流动,这样理解不知道是不是容易些?流主要分以下几种类型:

  • 输入流和输出流:就是流的方向。 InputStream和Reader是输入,OutputStream和Writer是输出,很简单
  • 字节流和字符流:流的最小单位,字节流好理解,字符流是因为gbk和Unicode等的存在,单独一个字节是无法表示一个字符的,2个字节为单位读取。InputStream和OutputStream是字节流,Reader和Writer是字符流
  • 基础流和封装流:以上四种都是基础流,提供的API基本都是get()一个字节/字符,write()一个字节/字符;封装流将基础流包装了一下,提供了更多的功能,比如最常用的BufferedStream,用来缓存流从而提高IO效率;DataStream,提供读写Java基本类型的流,可以直接写入一个int、double、UTFString等;StreamReader、StreamWriter,将字节流转换为字符流;其他还有ByteArrayStream、FileStream等,字面意思就很明白了

弄清楚这些,其实Java IO基本就能搞明白了。传说中的三层流封装就很明了了,第一层基础流,比如InputSream,第二层InputStreamReader,转换为字符流,第三层再包装一个BufferedReader,提高IO效率,很清楚也很简单,不要被这个流程搞晕了。大致上基础io包也就这些东西了。

接下来就讲讲刚看的nio包,nio比基础io更抽象更难用,其实基础io功能也很强大了,所以一直没鼓起勇气去学nio。在百度文库下到一个不错的教程,2天就看完了,讲讲自己的心得。

先说nio中比较易用且实用的,就是各种Buffer,最基础的ByteBuffer,CharBuffer也不错,还有各种其他类型的Buffer。Buffer有position、limit、capacity属性。position为当前buffer操作到了哪个位置,包括读和写,limit为用户可自己限制的此buffer的结尾位置,capacity就是buffer的大小,综合起来就是:0 <=position <= limit <= capacity <= size of array。主要的API有flip(),主要用于将数据读入到buffer后,将limit设为当前的position,然后将position设为0,就可以从头到尾把所有的数据读出来了。

再说说文件读写中的FileChannel,这个是一个nio中新的概念,类似于stream,可以从FileStream中通过getChannel()获取,然后FileChannel的read(ByteBuffer)方法直接将字节流读入buffer,操作挺方便;官方介绍FileChannel说这是个可读可写并且双向的流,可读可写倒确实,不过双向我暂时没有看出来,文件copy的过程中还是需要建立1个InputStream获得一个FileChannel,1个OutputStream获得一个FileChannel,不能用1个FileChannel来搞定,双向意义何在?

综合FileChannel和Buffer举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FileInputStream fis = new FileInputStream(new File("a.txt"));
FileChannel fin = fis.getChannel();
FileOutputStream fos = new FileOutputStream(new File("b.txt"));
FileChannel fout = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024); //1024字节的buffer
while(fin.read(buffer) != -1){
     buffer.flip(); //buffer写满,position重新置0,limit置为结尾,方便使用
     fout.write(buffer);
     buffer.clear();//清空buffer
}
fin.close();
fout.close();
fis.close();
fos.close();

还有一个也比较实用的是Charset和对应的CharsetEncoder和CharsetDecoder,可以将字节流与不同的字符流之间相互转换。

最后是nio中最麻烦应该也是最强大的地方,异步IO,这儿涉及很多新的概念和类,Selector、ServerSocketChannel、SelectionKey,注册事件、监听事件、处理事件等,我就看了一个下午左右,理解也不是非常深,大致知道这些类怎么串起来用。还是看程序来的学得快,程序我放到附件中,理解了NIOServer和NIOClient,就有了基础了。当然程序中比较缺乏的一点就是处理事件的时候是单线程的,这样事件队列一旦越积越多,速度就慢了,开几个线程同时来响应事件是比较好的方案。

nio中还有其他的一些东西,比如Buffer的一些深入 direct Buffer,越过临时buffer提高速度;Memory-mapped file I/O,提高文件读写速度;File locking(这个还不是很懂)。

又掌握了Java中一个很重要的类包,还是挺开心的,坚持写完这篇日志也是受了gstar博客大牛的影响,多写写技术blog哈~接下来的目标,当然是把nio好好再消化下,然后自我觉得没有掌握而觉得很重要的还有java.util.concurrency包、java.security包、java.rmi包,主要这些平时比较少用,嗯,慢慢来~

附:包括一个NIO的教程,和异步IO的2个示范类(此2类没有经过任何测试,只是为了使用一下NIO中的

分享到:
评论
5 楼 lxy2330 2012-08-06  
我也 不知道了
4 楼 MrLee23 2012-08-06  
Java学习之IO与NIO篇
lxy2330 写道
你可以在ITEYE上再搜搜啊!

我搜索了,貌似只有你这个文章,但是没附件,你能帮我找下吗,谢谢了。
3 楼 lxy2330 2012-08-06  
你可以在ITEYE上再搜搜啊!
2 楼 lxy2330 2012-08-06  
没有了啊,这是转的别人的!
1 楼 MrLee23 2012-08-06  
这个附件在什么地方,求连接,谢谢了

相关推荐

    Java IO与NIO:深入理解与实践指南

    Java IO和NIO提供了两种不同的I/O处理方式,各有优势和适用场景。IO适用于简单的I/O操作,而NIO则适合于需要高性能和高并发的应用。了解这两种I/O处理方式的区别和特点,可以帮助开发者根据具体的应用需求选择合适的...

    Java IO, NIO and NIO.2

    Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...

    java io 与java nio区别

    ### Java IO 与 Java NIO 的区别 在深入探讨Java IO与Java NIO之间的区别之前,我们先简单回顾一下这两种I/O模型的基本概念。 #### 1. Java IO(Blocking IO) Java IO,也称为传统的阻塞式IO或同步阻塞式IO,是...

    Java IO与NIO文档

    Java IO与NIO是Java平台中用于处理输入输出操作的核心技术。它们在处理数据传输、文件操作、网络通信等方面起着至关重要的作用。本篇将深入探讨这两个领域,旨在帮助开发者更好地理解和应用这些概念。 首先,Java ...

    java学习笔记1(java io/nio)

    java学习笔记1(java io/nio)设计模式

    Java IO_NIO

    **NIO与IO的区别** 1. 阻塞与非阻塞:Java IO是阻塞的,而NIO是非阻塞的,可以在没有数据可读时不做等待,而是继续处理其他任务。 2. 多路复用:NIO的选择器允许单线程管理多个通道,而传统的IO需要为每个连接创建一...

    高性能网络编程必备技能之IO与NIO阻塞分析

    IO与NIO的主要区别在于处理阻塞的方式。IO是面向流的,每次操作只能处理一个流,且一旦阻塞就会占用整个线程,直到操作完成。而NIO是面向缓冲区的,可以同时处理多个通道,通过Selector进行多路复用,减少了线程的...

    Java IO NIO and NIO 2 epub

    Java IO NIO and NIO 2 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Java IO NIO and NIO 2 无水印pdf

    Java IO NIO and NIO 2 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...

    java nio与io性能测试

    本文将深入探讨Java NIO与IO的性能测试,并通过代码实例来展示它们之间的差异。 首先,我们来看传统的Java IO模型。IO模型基于流,数据是从输入流到输出流的单向传输。例如,`FileInputStream`和`FileOutputStream`...

    IO和NIO区别

    Java 中的 IO 和 NIO 是两个不同的输入/输出机制,它们之间有许多区别。下面我们将详细讲解 IO 和 NIO 的区别。 1. 数据处理方式 标准 IO 以流的方式处理数据,也就是说数据是以流的形式传输的,而 NIO 则以块的...

    Java IO,NIO and NIO.2 mobi

    java io nio nio2 java io的百科全书 mobi格式 需要kindle 软件

    JAVA IO and NIO

    Java IO (Input/Output) 和 NIO (Non-blocking Input/Output) 是Java平台中用于处理输入和输出操作的重要部分。这两种技术在实现客户端与服务器之间的通信时起着至关重要的作用。下面将详细介绍Java IO和NIO的特点、...

    Java中的IO与NIO-jiava求职面试-15题,答案

    Java中的IO与NIO是Java开发中至关重要的概念,它们主要负责数据的输入与输出操作。在面试中,了解和掌握这些知识点对于成为一名合格的Java开发者至关重要。 首先,Java的IO流体系是其核心特性之一。IO流可以分为四...

    Java IO, NIO and NIO.2(Apress,2015)

    Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

    JAVA的IO与NIO

    知识点1:NIO与IO的区别 IO(Input/Output)是Java早期提供的输入输出模型,其核心是基于流(Stream)的操作。IO以字节流或字符流的形式处理数据,一次处理一个字节,这种方式对于小规模数据处理效率较高,但在处理...

    java IO NIO AIO.xmind

    涉及到java io, nio, aio相关知识点,学习过程中的一些总结,持续更新中,xmind 格式

    Java NIO与IO性能对比分析.pdf

    本文将分析Java NIO与Java IO在性能上的对比,并尝试找出性能差异的原因,以及探讨哪种编程模型更适合高并发的应用场景。 Java IO模型是一种阻塞型I/O模型,在数据的读写过程中,如果线程在等待数据,将会一直被挂...

Global site tag (gtag.js) - Google Analytics