// 通过nio的Channel来读写文件
public class NioFileReadWrite {
public static void main(String[] args) {
String file = "d:\\n4.txt";
String file2 = "d:\\ncc.txt";
// 1.通过Channel-Buffer进行文件读写
// new Thread(new ReadFileThread(file, file2)).start();
// 2.内存映射文件读取: 速度快 MappedByteBuffer
new Thread(new MapFileReadThread(file)).start();
}
static class ReadFileThread implements Runnable{
private String file;
private String file2;
public ReadFileThread(String file, String file2){
this.file = file;
this.file2 = file2;
}
public void run(){
try{
int num = 1024;
int k =0;
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file2);
// 1.从FileInputStream对象获取文件通道FileChannel
FileChannel channel = fis.getChannel();
FileChannel channel2 = fos.getChannel();
long size = channel.size();
// 2.从通道读取文件内容
byte[] bytes = new byte[num];
ByteBuffer byteBuffer = ByteBuffer.allocate(num);
// 每次read都将读取 allocate 个字节到ByteBuffer
int len = -1;
while ((len = channel.read(byteBuffer)) != -1) {
// 注意先调用flip方法反转Buffer,再从Buffer读取数据
byteBuffer.flip();
// 有几种方式可以操作ByteBuffer
// 1.可以将当前Buffer包含的字节数组全部读取出来
//bytes = byteBuffer.array();
// System.out.print(new String(bytes));
// 2.类似与InputStrean的read(byte[],offset,len)方法读取
// byteBuffer.get(bytes, 0, len);
// System.out.print(new String(bytes, 0 ,len));
channel2.write(byteBuffer);
// 最后注意调用clear方法,将Buffer的位置回归到0
byteBuffer.clear();
k++;
}
System.out.println("k="+k);
// 关闭通道和文件流
channel.close();
fis.close();
channel2.close();
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
static class MapFileReadThread implements Runnable{
private String file;
public MapFileReadThread(String file){
this.file = file;
}
public void run() {
try{
int num = 1024;
RandomAccessFile fis = new RandomAccessFile(new File(file), "rw");
FileChannel channel = fis.getChannel();
long size = channel.size();
// 构建一个只读的MappedByteBuffer
MappedByteBuffer mappedByteBuffer = channel.map(MapMode.READ_ONLY, 0, size);
// 如果文件不大,可以选择一次性读取到数组
// byte[] all = new byte[(int)size];
// mappedByteBuffer.get(all, 0, (int)size);
// 如果文件内容很大,可以循环读取,计算应该读取多少次
byte[] bytes = new byte[num];
long cycle = size / num;
int mode = (int)(size % num);
for (int i = 0; i < cycle; i++) {
// 每次读取allocate个字节
mappedByteBuffer.get(bytes);
// 打印文件内容,关闭打印速度会很快
System.out.print(new String(bytes));
}
if(mode > 0) {
bytes = new byte[mode];
mappedByteBuffer.get(bytes);
System.out.print(new String(bytes));
}
// 关闭通道和文件流
channel.close();
fis.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
相关推荐
- **主要内容**:演示如何分配Buffer以及如何通过Buffer进行数据的读写操作。 - **学习目标**:熟练使用Buffer进行数据交换。 #### 16. Java NIO-Buffer-几个方法 - **主要内容**:讲解Buffer的一些常用方法,如...
NIO通过引入Channel、Buffer以及Selector等核心组件,极大地提高了数据读写的效率。 #### 二、Channel简介 **Channel**是NIO中的一个核心概念,它是一种双向的数据传输通道,可以实现数据的读取或写入。在NIO中,...
这个压缩包“动态演示nio中的buffer相关操作.zip”显然是为了帮助用户直观地理解NIO Buffer的工作机制,通过动态演示来展示Buffer如何存储、读取和传输数据。 在Java NIO中,Buffer是一个特定类型的数组,用于临时...
NIO的核心组件包括Channel、Buffer和Selector,它们共同构建了一个非阻塞的I/O模型。 1. **Channel**:在NIO中,数据通过Channel进行传输。Channel类似于传统I/O中的流,但它可以同时读写,并且是双向的。常见的...
NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。通道可以读写数据,缓冲区用于临时存储数据,选择器则用于监听多个通道的事件,实现了多路复用,从而实现非阻塞I/O。 3. **HttpCore NIO...
- **FileChannel**:用于与文件进行交互的Channel,提供了读写操作的支持。 #### 三、使用Java NIO读取超大数据文件 在Java NIO中,处理超大数据文件的关键在于合理利用内存映射文件(Memory-Mapped Files)来提高...
除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...
在Socket通信中,NIO主要通过Selector和Channel两个核心组件来实现。Selector负责监听多个Channel的读写事件,而Channel则代表了与操作系统进行I/O操作的通道。当数据准备好时,Selector会返回一个包含就绪通道的...
- **Channel读写**:演示如何使用FileChannel读取和写入文件,以及如何通过SocketChannel进行网络通信。 - **Buffer操作**:展示如何创建、填充、清空和读取缓冲区,以及如何使用`flip()`、`clear()`和`compact()`...
相比之下,NIO(Non-blocking I/O)通过选择器和通道的概念,使得一个线程可以同时处理多个连接,极大地提高了服务端的并发处理能力。Matrix-NIO就是利用这种机制,为开发者提供了一套易于使用的API,用于构建可扩展...
与传统的I/O模型(BIO)不同,NIO不依赖于线程池来处理并发连接,而是通过选择器(Selector)来轮询和监听通道(Channel)上的事件。这使得NIO在资源利用率和性能上有了显著提升。 在"socket-nio-single-reactor....
1. **Channel**:在NIO中,数据读写是通过Channel进行的,它像一个管道,可以从一个源头(如文件或网络连接)到目的地(如另一个文件或网络连接)传输数据。例如,FileChannel可以用来读取和写入文件。 2. **Buffer...
总的来说,Java NIO提供了一种更高效、灵活的方式来处理文件读取和其他I/O操作,尤其适合需要处理大量并发I/O请求的场合,例如服务器端编程。通过熟练掌握NIO,开发者可以构建出更加高效的Java应用程序。
Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种新的方式来处理I/O操作,相比传统...通过理解其核心组件和操作机制,开发者可以充分利用NIO来优化文件读写性能,尤其是在高并发和大文件处理的场景下。
在Java NIO中,数据的读取和写入都是通过通道(Channel)进行的。通道可以理解为连接到I/O设备的桥梁,例如文件、网络套接字等。要使用NIO写文件,首先需要获取FileChannel对象,这可以通过`FileOutputStream`的`...
Java NIO提供了一种高效、灵活的文件操作方式,通过Buffer、Channel、Paths和Files等核心组件,可以实现复杂的文件读写操作。NIO的异步操作特性也使得它在处理大量并发文件操作时具有显著的性能优势。在实际开发中,...
Java NIO 是 JDK 1.4 中引入的新的 IO 方式,它主要包含 Buffer、Channel、Selector 三个核心的组件。 Java NIO 概述 ---------------- Java NIO 是 Java 编程语言中的一种新的 IO 模式,它与传统 IO 的区别在于...