题,本代码是通过使用JAVA中的Channel实现的拷贝文件的例子,代码中的注释已经比较清晰说明了其实现过程:
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream(new File("./NioTestFile.txt"));
FileChannel fileChannel = in.getChannel();// 源文件的通道
FileOutputStream out = new FileOutputStream(new File(
"./NioTestFileNew.txt"));// copy文件的通道
FileChannel fileChannelout = out.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(50);// 缓冲区允许的最大容量
while (true) {
buffer.clear();// 先清空上一次所写进缓冲区的数据
int r = fileChannel.read(buffer);// 读取新的数据
System.out.println(r);// 把读取的数组大小打印出来
if (r <= 0) {
// r的值可以为0或-1
// 0:表示缓冲区的容量已满,不能往bufer中写数据了(因此把一部分数据copy完后,要将前面的clear掉)
// -1:channel中的数据已经写完
System.out.println("read finished.");
break;
}
buffer.flip();// 可以理解为"换"一个channel,此时相当于对缓冲区里的所有数据"写"向其他channel
fileChannelout.write(buffer);// 向channel中写入数据
}
}
从打印出的信息可以看出来,50是表示缓冲区所读取的最大容量,也就是代码中ByteBuffer.allocate(50)所设置的,当读取到数据的最后一段时,该值必定小于50,如上面所打印的27,此时表示数据已经读取完了,继续读取则会返回-1,因此,此时可以判断数据已经读取完了,可以把数据流方向flip到另外一条channel中,实现”写”的操作~~
本文简单介绍了通过channel实现数据读取和写出(也就是实现”拷贝”)的过程,代码非常简单,仅供参考学习,有什么问题请指出~
原文链接:
http://www.sujunqiang.com/archives/174.html | 苏骏强的博客
分享到:
相关推荐
本篇文章将详细介绍如何使用Java的IO流来实现文件的复制。 首先,我们需要了解Java中的IO流体系。Java的IO库基于流的概念,流可以视为数据的序列,可以从源(如键盘、文件)读取到目的地(如显示器、文件)。IO流...
这个压缩包文件"java Netty 框架例子源码.rar"很可能包含了一系列示例代码,帮助我们了解和学习如何在实际项目中使用 Netty。 Netty 的核心组件包括: 1. **Channel**:是 Netty 中的基本概念,代表一个打开的连接...
2. 生成Java类:使用Protobuf的编译器protoc将.proto文件编译为Java类,这里会生成HelloWorld类。 3. 编写Netty编码器和解码器:在Netty中,我们需要自定义编码器(Encoder)和解码器(Decoder),以便在数据发送前...
在Java中,可以通过`java.nio.MappedByteBuffer`类来实现共享内存功能,这被称为内存映射文件(Memory-Mapped File,MMF)。 `MappedByteBuffer`是NIO中的一种特殊缓冲区,它将文件的一部分映射到内存中,使得文件...
Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java程序...对于压缩包中的"ffc"文件,很可能是实现这个快速文件复制功能的Java代码,通过阅读和理解这个代码,我们可以更深入地学习和掌握Java NIO的精髓。
通过阅读博客《Netty--Java IO/NIO 框架 简单学习例子》,你可以了解如何使用 Netty 创建简单的服务器和客户端,以及如何处理网络通信的基本流程。在实际项目中,Netty 的强大功能和易用性使其成为Java网络编程的...
Netty 提供了多种性能优化手段,如零拷贝、DirectByteBuffer 使用、内存池等。零拷贝避免了数据在用户空间和内核空间间的多次复制,而 DirectByteBuffer 则减少内存到物理磁盘的交互,内存池则减少了对象创建的开销...
9. **线程模型**:Netty 使用了事件驱动的单线程模型,即一个 EventLoop 处理一个 Channel 上的所有事件,减少了线程切换的开销。 10. **Future 和 Promise**:Netty 提供了 Future 和 Promise 来处理异步操作的...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,专为 Java 设计。它提供了一个高效、灵活且可扩展的框架,使开发者能够快速构建网络服务器和客户端,包括TCP、UDP、HTTP、WebSocket 等多种协议。Netty4.0 是...
在这个例子中,`ByteBuffer`先被分配了空间,`channel.read(buffer)`将文件内容读入缓冲区,`buffer.flip()`切换缓冲区状态以便读取,`buffer.get()`逐个取出字符,最后`buffer.clear()`清空缓冲区以备下次读取。...
Netty通过FileRegion和CompositeByteBuf实现了零拷贝,减少了CPU和内存之间的数据传输,提升了性能。 六、Netty的编码解码器 Netty提供了各种编码解码器,如LengthFieldBasedFrameDecoder用于处理带长度字段的协议...
Netty是一个高性能的NIO(New I/O,即非阻塞...学习和使用Netty,不仅可以加深对Java NIO的理解,还能提高处理网络编程问题的能力。随着网络编程经验的积累,我们可以更好地利用Netty框架来构建稳定、高效的网络服务。
4. **零拷贝技术**:通过内存映射文件和直接内存分配,减少数据在内核空间和用户空间之间的复制,提高性能。 5. **ChannelHandlerContext**:上下文对象,用于在Pipeline中的Handler之间传递信息和触发事件。 6. *...
5. **零拷贝**:Netty 支持通过内存映射文件和直接内存分配等方式实现零拷贝,极大提高了数据传输性能。 6. **线程模型**:Netty 的线程模型设计得非常灵活,可以根据实际需求配置工作线程的数量,适应不同的系统...
这个“netty例子 官方”压缩包很可能是官方提供的Netty使用示例,帮助开发者更好地理解和应用Netty框架。下面将详细探讨Netty的一些核心概念和应用场景。 1. **Netty概述**: Netty 是由 JBoss 提供的一个开源框架...
- Netty 是由 JBoss 提供的开源框架,主要用 Java 编写,它简化了网络编程,特别是 TCP 和 UDP 协议的实现。 - Netty 的核心是其 Channel、EventLoop、Buffer 和 Pipeline 模型。Channel 代表网络连接,EventLoop ...
在 "LearnDemo" 文件中,你可能能够找到关于如何使用 Netty 创建一个简单的服务器或客户端的示例代码。这可能包括配置 EventLoopGroup,创建 ServerBootstrap 或 Bootstrap 对象,设置 ChannelPipeline,以及编写...
在这个例子中,我们使用了NioServerSocketChannel作为服务器通道,通过childHandler方法设置了每个新连接的管道。管道中的组件包括DelimiterBasedFrameDecoder用于分帧,StringDecoder和StringEncoder分别用于字符串...
而Netty采用了非阻塞的NIO(New IO)模型,利用Java的Selector和Channel,使得一个线程可以同时处理多个连接,极大地提高了系统的并发能力。在这个入门例子中,你会看到如何创建并配置EventLoopGroup,这是Netty的...
6. **零拷贝**:介绍Netty如何利用Java的DirectBuffer和FileRegion实现零拷贝,提高传输效率。 7. **心跳与连接管理**:讨论Netty如何实现心跳检测和连接管理,确保长连接的稳定。 8. **性能优化**:分享如何通过...