package com.bxf.NIOTest;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class allocateDirectTest {
public allocateDirectTest(){}
String sfin = "K:\\tmp\\FileIn.txt";
String sfou = "K:\\tmp\\FileOut.txt";
String sfou2 = "K:\\tmp\\FileOut2.txt";
public void copyFileByAllocDir() throws Exception{
FileInputStream fin = new FileInputStream(sfin);
FileChannel fcin = fin.getChannel();
FileOutputStream fout = new FileOutputStream(sfou);
FileChannel fcout = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
long startTime = System.currentTimeMillis();
while(true){
buffer.clear();
int r = fcin.read(buffer);
if(r == -1)
break;
buffer.flip();
fcout.write(buffer);
}
long endTime = System.currentTimeMillis();
System.out.println("By copyFileByAllocDir Use time : " + (endTime - startTime));
}
// 经测试使用ByteBuffer.allocateDirect(1024)的确要比使用
// ByteBuffer.allocate(1024)快!
public void copyFileByAlloc() throws Exception{
FileInputStream fin = new FileInputStream(sfin);
FileChannel fcin = fin.getChannel();
FileOutputStream fout2 = new FileOutputStream(sfou2);
FileChannel fcout2 = fout2.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
long startTime = System.currentTimeMillis();
while(true){
buffer.clear();
int r = fcin.read(buffer);
if(r == -1)
break;
buffer.flip();
fcout2.write(buffer);
}
long endTime = System.currentTimeMillis();
System.out.println("By copyFileByAlloc Use time : " + (endTime - startTime));
}
}
// 第一次测试结果:
// By copyFileByAllocDir Use time : 50
// By copyFileByAlloc Use time : 69
// 第二次测试结果:
// By copyFileByAllocDir Use time : 52
// By copyFileByAlloc Use time : 58
如果将buffer调大到:100*1024,差距就更明显了:
//By copyFileByAllocDir Use time : 3
//By copyFileByAlloc Use time : 68
//By copyFileByAllocDir Use time : 2
//By copyFileByAlloc Use time : 60
分享到:
相关推荐
2. **直接缓冲区**:对于性能敏感的应用,可以使用`ByteBuffer.allocateDirect(int capacity)`创建直接缓冲区,它直接在物理内存中分配空间,减少了Java对象头的开销,但可能涉及内存复制。 三、ByteBuffer的主要...
2. 使用`ByteBuffer.allocateDirect(int capacity)`:分配一个直接缓冲区,直接缓冲区通常在物理内存中,而不是Java堆上,能提高性能,尤其在处理大文件时。 3. 使用`ByteBuffer.wrap(byte[] array)`:将已有的字节...
ByteBuffer是NIO中的关键类,它与其他类型的Buffer(如CharBuffer、IntBuffer等)一样,具有capacity、limit和position属性。但是,ByteBuffer与Channel和Selector的交互更加紧密。例如,可以从FileChannel中读取...
综上所述,NIO是非阻塞式I/O模型的重要实现,通过使用`Channel`、`Selector`和`ByteBuffer`等核心组件,能够显著提高Android应用程序在网络通信方面的性能。对于需要处理高并发请求的应用场景尤为适用。
在`CoreJava_day21`的学习笔记中,主要探讨了Java中的NIO(New I/O)包及其关键类和接口,包括`ByteBuffer`、`FileChannel`以及网络编程中常用的`ServerSocket`和`Socket`等。NIO自JDK 1.4引入以来,因其高效性和...
实例化ByteBuffer有两种主要方式:allocate()用于在堆上分配内存,而allocateDirect()则是在堆外直接分配,适用于需要高效访问和多次复用的情况。ByteBuffer还可以通过wrap()方法从byte数组中创建,或者通过put()...
### Java中的缓冲区详解 #### 一、缓冲区概述 ...通过合理地使用直接缓冲区和非直接缓冲区,开发者可以显著提高应用程序的性能。了解缓冲区的基本概念、特性和使用方法对于任何Java开发者来说都是非常重要的。
- `allocateDirect(int capacity)`:创建一个Direct ByteBuffer,它通常在内存映射文件或直接I/O操作中性能更优。 - `wrap(byte[] array)`:将已存在的字节数组包装成ByteBuffer。 - `wrap(byte[] array, int offset...
### Java NIO (New Input/Output):IBM技术文档概览...同时,NIO库还提供了一系列高级特性,如异步I/O和直接缓冲区,进一步增强了Java在高性能I/O处理方面的实力。希望本文档能够成为Java开发者学习NIO的重要参考资料。
### Java NIO 相关知识点 #### 一、Java NIO 概述 ...以上内容总结了《Java NIO》一书中关于 Java NIO 的核心概念、技术细节以及实际应用案例,旨在帮助开发者更好地理解和运用 Java NIO 来提高程序的性能和可靠性。
2. **创建缓冲区**:`java.nio.ByteBuffer`是最常用的缓冲区类型,可以通过`allocate()`、`allocateDirect()`等方式创建。 3. **读写数据**:通过`channel.read(buffer)`和`channel.write(buffer)`方法在通道与缓冲...
- **内存泄漏**:由于直接缓冲区不参与垃圾回收,使用后必须确保释放,否则可能导致内存泄漏。 - **内存碎片**:长期使用直接缓冲区可能导致内存碎片,影响系统性能。 - **容量限制**:直接缓冲区的大小受限于JVM...
### Java读取大文件技术详解 #### 一、引言 在Java开发中,处理大文件是一...通过合理的代码设计和性能优化策略,可以极大地提高处理大文件的速度。希望本文能够帮助开发者更好地理解和应用Java中的大文件读取技术。
虽然对于大多数日常应用场景而言,这种模型已经足够高效和方便,但在一些高性能或服务器端的应用场景中,传统的阻塞式IO模型存在明显的性能瓶颈。 随着互联网的发展,特别是服务器端应用程序的需求越来越复杂,对IO...
- **创建缓冲区**:使用静态工厂方法创建缓冲区实例,例如 `ByteBuffer.allocate(1024)` 创建一个容量为 1024 字节的 `ByteBuffer`。 - **操作方法**:`put()` 方法用于向缓冲区写入数据,`get()` 方法用于从缓冲...
NIO的API设计考虑到了性能和灵活性,通过使用缓冲区和通道,可以让开发者更好地控制数据的处理过程,同时利用缓冲机制实现数据的批量操作。 在Java NIO中,所有的输入输出操作都围绕着Buffer和Channel这两个核心...
`allocate()`创建的是堆缓冲区,而`allocateDirect()`创建的是直接缓冲区,后者能避免Java对象与操作系统之间的数据复制,提高性能。 缓冲池的使用有以下优势: 1. **减少内存分配**:预先分配内存,避免频繁的`new...
6. 使用 ByteBuffer 对象将数据写入到文件中。 7. 重复步骤 5 和 6,直到读写完成。 示例代码 以下是一个使用 Java NIO 实现超大文件的读写的示例代码: ```java package cn.gzu.readfile; import java.io.File; ...