`
Mojarra
  • 浏览: 131098 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java NIO小结 (一)

    博客分类:
  • JDK
阅读更多

    自JDK1.4后,Java推出了New/IO(java.nio.*)。在JDK1.4之前,原IO(java.io.*)处理只能是stream的方式 逐个字节逐个字节读取或者写入。流处理方式性能低。而New/IO处理数据时以块为单位,系统的IO开销小,但IO性能高。



New/IO的4个核心概念

Buffer 处理IO时,数据的载体

Charset 把unicode字符进行编码成字节码或者把字节码反编成unicode字符

Channel 连接着能进行IO操作的实体,比如一个Channel可以连接一个输入流,也可以连接一个输出流,还可以连接一个输入流和一个输入流,根据channel上连接的具体的流,可以进行输入或输出操作。

SelectorSelectionKey 与Selectable Channel一起,定义了多路复用和Non-Blocking IO操作能力。


Blocking IO和Non-Blocking IO

阻塞IO模式下,任何IO操作会阻塞Channel直到这个IO操作完成后,方可在这个通道上进行其它IO操作。非阻塞模式下,一个IO操作调用时,通道不会被阻塞,即使这个IO操作只传输了少量数据甚至完全没有传输数据。非阻塞模式最适用于多路复用IO编程,比如服务器端socket编程。

 

在JDK1.4中,传统的IO与New/IO已经有很好的集成,在传统的io包中,可以使用Channel,但是要根据具体的输入和输出流来决定。比如下 面的代码先定义一个文件输入流,通过文件输入流的FileChannel读取文件的头512个字节到缓存中,然后使用utf-8编码器把缓存中的内容反编 码成一个utf-8字符串。

 

Charset utf8 = Charset.forName("utf-8");
ByteBuffer buffer = ByteBuffer.allocate(512);
FileInputStream fis = new FileInputStream("a.txt");
FileChannel fileChannel = fis.getChannel();
fileChannel.read(buffer);
buffer.flip();
String content = utf8.decode(buffer);

 

反之,用FileChannel写入文件也是相当的方便,和读取类似。FileChannel写入的方式依赖于输入流的打开方式。下面的代码以 Append方式打开一个文件输出流,用这个流的FileChannel写入编码后的“hello java new IO"字符串。

 

FileOutputStream fos = new FileOutputStream("a.txt", true);
FileChannel fileChannel = fos.getChannel();		 
fileChannel.write(utf8.encode("hello java new IO"));

 

使用Channel的优点在于channel是可以同时输入输出的,而不要像传统的io那样打开一个输入流,打开一个输出流,在读/写时,这两个流总是要配对使用,下面的代码展示如何用一个FileChannel做输入和输出两种IO操作。

Charset utf8 = Charset.forName("utf-8");
//以读写方式随机存储文件
RandomAccessFile raf = new RandomAccessFile("1.txt", "rws");
FileChannel fc = raf.getChannel();

//写入hello file channel到文件中
fc.write(utf8.encode("hello file channel"));

//分配10个字节缓存
ByteBuffer buff = ByteBuffer.allocate(10);

//从文件起始位置开始读取10个字节,并输出
fc.read(buff, 0);
buff.flip();
System.out.println(utf8.decode(buff)); // 输出hello file
fc.close();
raf.close();

 

 

 

[原创内容,版权所有,如有转载,请注明出处,如有错误之处,请指出,不胜感激]

分享到:
评论

相关推荐

    Java 垃圾回收小结(一)

    本文将对Java垃圾回收进行小结,探讨其基本原理、类型以及常见算法。 1. 基本原理: Java中的内存分为堆(Heap)和栈(Stack)两部分,垃圾回收主要关注堆内存。当一个对象不再被任何引用指向时,它被视为可回收的...

    java线程与并行(主要讲解java的nio包某些内容)

    #### 五、小结 本文详细介绍了Java中线程的基本概念、创建方式、生命周期以及如何控制线程执行等知识点。通过实际示例代码展示了如何创建和使用线程,帮助读者更好地理解和应用Java线程技术。在实际开发中,合理...

    Java下TCP文件传输功能实现

    ### 小结 本文介绍了 Java 中如何利用 TCP 协议实现文件传输。通过了解 TCP/IP 协议的基础知识以及 Socket 编程的基本原理,我们实现了客户端与服务器之间的文件传输功能。这种技术在实际开发中非常有用,尤其是在...

    java 实现音乐播放器资料总结

    此外,可能还需要用到java.nio.file包中的类,以支持更高级别的文件系统操作。 7. **播放列表管理**:音乐播放器通常包含播放列表功能,允许用户添加、删除和排序歌曲。这需要数据结构如ArrayList或LinkedList来...

    Java 网络编程实验报告 含实验总结

    在这个实验中,可能使用了`java.io`和`java.nio`包下的类,如`InputStream`、`OutputStream`、`BufferedReader`和`PrintWriter`等,它们用于在网络连接中接收和发送数据。 2. **Java线程**:在网络编程中,多线程是...

    java初学者应该阅读的书籍

    ### 小结 通过系统地学习上述书籍,Java初学者将能够建立起全面而深入的知识体系。这些书籍不仅仅是理论知识的堆砌,更重要的是提供了大量实用的代码示例和案例分析,有助于读者更好地理解和掌握Java语言的特点。...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    感谢大家的支持,我终于升级了,上传限制得到提升,所以把资源整合下!希望大家一如既往 Java SE实践教程 pdf格式电子书 下载(一) 更新 ...Java SE实践教程 pdf格式电子书 下载(二) 更新 ...13.4 小结 387

    java结课设计,一款完全基于servlet的网盘系统.zip

    4. **文件I/O操作**: Java提供了一系列的类库支持文件的读写操作,如java.io.File、java.nio.file.Files等,这些在网盘系统中必不可少,用于处理文件的上传和下载。 5. **HTTP协议**: 作为基于HTTP的系统,理解和...

    基于netty的websocket开发小结

    这篇基于Netty的WebSocket开发小结将探讨如何使用Netty实现WebSocket服务端和客户端的交互。 首先,我们要理解WebSocket的基本概念。WebSocket协议定义了一种在单个TCP连接上进行全双工通信的协议。它通过在握手...

    疯狂JAVA讲义

    1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...

    java实现守护进程,有单独的监听进程, 两个或多个进程,两个或多个jvm

    在Java中,我们可以使用`java.net.ServerSocket`来监听TCP连接,`java.nio.channels.FileChannel`来监听文件系统变化。监听进程通常设计为无阻塞的,以确保它可以高效地处理多个并发事件。 接下来,我们将探讨如何...

    Java SE实践教程 源代码 下载

    1.3 小结 35 第2章 对象无处不在——面向对象的基本概念 37 2.1 讲解 38 2.1.1 什么是面向对象 38 2.1.2 面向对象的基本概念 38 2.1.3 Java对面向对象的支持 41 2.2 练习 42 2.2.1 JavaBeans技术开发可重用...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    感谢大家的支持,我终于升级了,上传限制得到提升,所以把资源整合下!希望大家一如既往 Java SE实践教程 pdf格式电子书 下载(一) 更新 ...Java SE实践教程 pdf格式电子书 下载(二) 更新 ...13.4 小结 387

    Java实现加密解密

    论文应详细阐述设计目标、需求分析、设计思路、详细设计(包括算法描述、类结构、界面设计等)、运行调试分析、设计体会和小结,以及参考文献。每个部分都需要清晰、完整地展示你的工作内容和思考过程。 7. **创新...

    文件读写操作小结

    本文将结合标题“文件读写操作小结”和提供的标签“源码”、“工具”,深入探讨文件读写的核心概念、常见方法以及在实际应用中的注意事项。 1. 文件系统基础 文件系统是操作系统用于组织和管理磁盘上数据的一种方式...

    Tomcat6性能优化(小结).pdf

    Tomcat6是一款广泛使用的开源Java Servlet容器,主要用于部署Java Web应用程序。在优化Tomcat6的性能时,了解其内部工作原理以及如何调整配置至关重要。本篇文章将聚焦于Tomcat6的性能优化,特别是关于NIO(非阻塞I/...

    java Streams and Serialization 详解

    #### 小结 通过本文的学习,我们不仅深入了解了Java中流的基本概念、分类和使用方法,还掌握了序列化的原理和实现方式。无论是进行数据读写还是对象状态的保存与恢复,掌握流和序列化的相关知识都是Java开发者不可...

    Java+TCPIP+Socket编程(中文版)

    - **Selector小结** Selector的工作原理总结。 - **数据报(UDP)信道** UDP信道的使用方法。 #### 第6章 深入剖析 - **缓冲和TCP** 缓冲区的管理及其对TCP性能的影响。 - **死锁风险** 并发环境下死锁...

Global site tag (gtag.js) - Google Analytics