新的输入/输出(NIO)库是在JDK 1.4中引入的。它与原来的I/O库最重要的区别是数据打包和传输的方式的不同,原来的 I/O 以流 的方式处理数据,而 NIO 以块 的方式处理数据。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。
(1)通道
Channel是对原I/O包中的流的模拟,可以通过它读取和写入数据。拿NIO与原来的I/O做个比较,通道就像是流。
通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类), 而通道可以用于读、写或者同时用于读写。
因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在UNIX模型中,底层操作系统通道是双向的。
(2)缓冲区
在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问NIO中的数据,您都是将它放到缓冲区中。
缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
最常用的缓冲区类型是ByteBuffer。 一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。
ByteBuffer不是NIO中唯一的缓冲区类型。事实上,对于每一种基本Java类型都有一种缓冲区类型:
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
每一个Buffer类都是Buffer接口的一个实例。
文件的读写
nio读取文件涉及三个步骤:
(1) 从FileInputStream获取Channel。
(2) 创建Buffer。
(3) 将数据从Channel读到Buffer 中。
文件的写操作与读操作类似。
下面我以文件的拷贝为例,展示一下nio的读写过程:
import java.io.FileInputStream;
2import java.io.FileNotFoundException;
3import java.io.FileOutputStream;
4import java.io.IOException;
5import java.nio.ByteBuffer;
6import java.nio.channels.FileChannel;
7
8/**
9 * 将一个文件的所有内容拷贝到另一个文件中。
10 *
11 * 基本步骤:
12 * 1.得到输入输出通道,创建缓冲区
13 * 2.从源文件中将数据读到这个缓冲区中,然后将缓冲区写入目标文件.此过程需不断循环直到源文件结束
14 *
15 * @author greatjone
16 */
17public class CopyFile {
18 public static void copy(String file,String copyfile) throws IOException{
19 // 获取源文件和目标文件的输入输出流
20 FileInputStream fin = new FileInputStream(file);
21 FileOutputStream fout = new FileOutputStream(copyfile);
22
23 // 获取输入输出通道
24 FileChannel fcin = fin.getChannel();
25 FileChannel fcout = fout.getChannel();
26
27 // 创建缓冲区
28 ByteBuffer buffer = ByteBuffer.allocate(1024);
29
30 while (true) {
31 // clear方法重设缓冲区,使它可以接受读入的数据
32 buffer.clear();
33
34 // 从输入通道中将数据读到缓冲区
35 int r = fcin.read(buffer);
36
37 // read方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1
38 if (r == -1) {
39 break;
40 }
41
42 // flip方法让缓冲区可以将新读入的数据写入另一个通道
43 buffer.flip();
44
45 // 从输出通道中将数据写入缓冲区
46 fcout.write(buffer);
47 }
48 }
49}
50
分享到:
相关推荐
### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...
以下通过一个简单的例子来展示如何使用NIO读取文件: ```java import java.io.File; import java.io.FileInputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class ...
以下是一个简单的NIO服务器示例,展示了如何使用Selector、Channel和Buffer处理客户端连接: ```java public class Server { private Selector selector; private ServerSocketChannel serverSocketChannel; ...
要使用NIO写文件,首先需要获取FileChannel对象,这可以通过`FileOutputStream`的`getChannel()`方法实现。 2. **缓冲区(Buffers)** 缓冲区是NIO的核心组件,它是数据在通道间传输的容器。Java NIO提供了几种...
总结一下,NIO服务器/客户端模式通过通道、缓冲区和选择器实现了非阻塞的I/O通信,有效提升了服务器处理并发连接的能力。理解并熟练掌握这些概念和实践,是成为一名优秀的Java网络编程开发者的关键。在实际开发中,...
在文件复制中,我们通常使用`transferTo()`和`transferFrom()`方法。 2. **ByteBuffer**:`java.nio.ByteBuffer`是NIO中最重要的缓冲区类型,它可以被映射到文件,也可以作为网络I/O的数据容器。在复制文件时,我们...
- **HeapByteBuffer**:在JVM堆上分配空间,使用简单但效率较低。 - **DirectByteBuffer**:直接在本机内存中分配空间,避免了JVM堆和本地内存之间的数据复制,提高了效率,但创建成本较高。 - **属性**:每个缓冲...
总结来说,这个压缩包的内容可能涵盖了如何在Java NIO中实例化和使用通道、缓冲区、选择器,以及如何实现一个简单的多线程服务器,利用选择器来监听和处理来自多个客户端的非阻塞I/O请求。这些内容对于理解和使用...
例如,如果有一个基础路径`/usr/local/bin`,可以使用`resolve()`方法来添加相对路径: ```java Path basePath = Paths.get("/usr/local/bin"); Path relativePath = Paths.get("java"); Path resolvedPath = ...
在深入探讨Java IO与Java NIO之间的区别之前,我们先简单回顾一下这两种I/O模型的基本概念。 #### 1. Java IO(Blocking IO) Java IO,也称为传统的阻塞式IO或同步阻塞式IO,是Java早期版本中的主要I/O处理方式。...
Java NIO-FileLock-介绍和使用方法 - **主要内容**:解释FileLock(文件锁)的作用及使用方法。 - **学习目标**:掌握文件锁的实现。 #### 29. Java NIO-FileLock-示例代码 - **主要内容**:提供使用FileLock的...
总结来说,MINA框架提供了NIO的高级抽象,使得开发者可以通过简单的API实现复杂网络服务,同时保持高性能和可扩展性。通过使用过滤器链和自定义处理器,MINA允许开发者以模块化的方式处理网络通信,从而专注于业务...
`nio-src.rar`文件中可能包含了一些NIO的示例代码,包括如何创建和操作通道、缓冲区以及选择器的实例,通过阅读和运行这些代码,可以帮助开发者深入理解NIO的工作原理和使用方法。 **8. 学习路径** 学习NIO,首先应...
通过本教程,我们不仅了解了Netty的基础概念,还通过实际代码示例学习了如何使用Netty构建一个简单的服务器和客户端应用程序。这对于理解Netty的工作原理和如何在实际项目中应用Netty都是非常有帮助的。
以下是一个简单的文件复制示例,使用 NIO 的 `FileChannel`: ```java public static void copyFileUsingNIO(String src, String dest) throws Exception { FileInputStream srcStream = new FileInputStream(src)...
总结来说,"NIO socket编程小例子 加法服务器"是一个很好的学习NIO网络编程的起点。通过这个实例,我们可以了解NIO Channel、Buffer和Selector的基本用法,以及如何构建一个简单的网络通信应用。对于任何想要提升...
总结来说,Java NIO提供了一种高效处理并发连接的方式,通过非阻塞I/O和反应器模式,服务器可以在一个或少量线程中处理大量并发请求,显著提升了性能。然而,正确使用NIO也需要关注潜在的问题,如CPU占用率过高和...
传统IO适用于简单且低并发的场景,而NIO则更适合高并发、高性能的应用。通过深入理解Channel、Buffer和Selector等核心组件的工作原理,开发者可以更好地利用NIO来提高程序的性能和灵活性。同时,对于文件编码和字符...