import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel;
/**
*
* Stream与MappedByteBuffer的性能对比.
*
Stream Write : 3.59
Mapped Write : 0.27
Stream Read : 3.17
Mapped Read : 0.21
Stream Read/Write : 30.86
Mapped Read/Write : 0.15
*
*
*/
public class MappedIO {
private static int numOfInts = 4000000;
private static int numOfUbuffInts = 200000;
private abstract static class Tester {
private String name;
public Tester(String name){
this.name = name;
}
public void runTest(){
System.out.print(name + " : ");
try {
long start = System.nanoTime();
test();
double duration = System.nanoTime() - start;
System.out.format("%.2f\n", duration/1.0e9);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public abstract void test() throws IOException ;
}
private static Tester[] tests = {
new Tester("Stream Write"){
public void test() throws IOException{
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File("d:\\temp.tmp"))));
for(int i = 0; i < numOfInts; i++){
dos.writeInt(i);
}
if(dos != null){
dos.close();
}
}
},
new Tester("Mapped Write"){
public void test() throws IOException{
FileChannel fc = new RandomAccessFile("d:\\temp.tmp", "rw").getChannel();
IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
for(int i = 0; i < numOfInts; i++){
ib.put(i);
}
if(fc != null){
fc.close();
}
}
},
new Tester("Stream Read"){
public void test() throws IOException{
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(new File("d:\\temp.tmp"))));
for(int i = 0; i < numOfInts; i++){
dis.readInt();
}
if(dis != null){
dis.close();
}
}
},
new Tester("Mapped Read"){
public void test() throws IOException{
FileChannel fc = new FileInputStream("d:\\temp.tmp").getChannel();
IntBuffer ib = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()).asIntBuffer();
while(ib.hasRemaining()){
ib.get();
}
if(fc != null){
fc.close();
}
}
},
new Tester("Stream Read/Write"){
public void test() throws IOException{
RandomAccessFile raf = new RandomAccessFile("d:\\temp.tmp","rw");
raf.writeInt(1);
for(int i = 0; i < numOfUbuffInts; i++){
raf.seek(raf.length() - 4);//绝对定位,离文件头的字节数.skipBytes相对定位,跳过指定长度。
raf.writeInt(raf.readInt());
}
if(raf != null){
raf.close();
}
}
},
new Tester("Mapped Read/Write"){
public void test() throws IOException{
FileChannel fc = new RandomAccessFile("d:\\temp.tmp", "rw").getChannel();
IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
ib.put(0);
for(int i = 1; i < numOfUbuffInts; i++){
ib.put(ib.get( i - 1));
}
if(fc != null){
fc.close();
}
}
}
};
public static void main(String[] args) {
for(Tester tst : tests){
tst.runTest();
}
}
}
分享到:
相关推荐
在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作,特别是在处理大量并发连接时,性能提升尤为显著。本篇文章将深入探讨Java NIO的基本概念、核心组件以及实际应用。 ...
传统的Java I/O基于流(Stream)和缓冲区(Buffer)的模型是阻塞式的,当进行I/O操作时,程序会等待数据准备好或写入完成,这在处理大量并发请求时可能会成为性能瓶颈。 NIO的核心组件包括以下几个部分: 1. **通道...
Java NIO(New IO),从 Java 1.4 开始引入,是 Java 标准 IO API 的一个补充,提供了与标准 IO 不同的工作方式。Java NIO 的主要特性包括: 1. **基于通道(Channel)和缓冲区(Buffer)的操作**:与标准 IO 基于字节...
### Java NIO 详解 ...通过以上介绍,我们可以看出Java NIO相比传统IO具有明显的性能优势,尤其是在处理大量并发连接和大数据量传输时。理解NIO的基本概念和组件是掌握Java网络编程和文件IO的关键。
### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...
Java的IO与NIO是程序与外部环境交互的基础,它们各自具有独特的优势和应用场景。传统IO适用于简单且低并发的场景,而NIO则更适合高并发、高性能的应用。通过深入理解Channel、Buffer和Selector等核心组件的工作原理...
NIO,全称New Input/Output,是从Java 1.4版本开始引入的一个新特性,它与传统的IO模型( Blocking I/O)相比,提供了更高效的数据传输方式。传统的IO基于流(Stream)和缓冲区(Buffer)操作,而NIO的核心在于通道...
java8 源码 netty-learn 这是一个用于netty学习的工程 ##NIO基础 三大组件 Channel & Buffer channel有点类似于stream,它就是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer中的数据写入到...
Java NIO(New IO)是自Java 1.4引入的,提供了一种新的IO模型,与传统的IO相比,NIO是非阻塞的,并且支持选择器(Selector),使得多路复用变得更加高效。`Channel`、`Buffer`和`Selector`是NIO的核心组件。 9. *...
Java NIO(非阻塞I/O)提供了一种新的I/O模型,通过通道(Channel)和缓冲区(Buffer)进行数据传输。`FileChannel`可以用来读写大文件,配合`MappedByteBuffer`实现内存映射文件,性能更优。 ```java FileChannel fc...
Java IO体系主要包括字节流(Byte Stream)和字符流(Character Stream),以及缓冲流(Buffered Stream)、转换流(Convert Stream)、对象流(Object Stream)等。其中,字节流处理单字节的数据,如InputStream和...
- Java的`MappedByteBuffer`类允许将文件映射到内存,使得文件操作如同访问内存一样快速,适合处理大型文件。 9. **大数据量文件读取策略** - **分块读取**:对于大文件,不一次性加载到内存,而是按需分块读取。...
Java的IO(Input/Output)是Java编程中的一个重要领域,主要负责数据的输入与输出操作。在Java中,IO API提供了丰富的类和接口,使得开发者能够有效地读取、写入数据,无论是从文件、网络还是内存。下面我们将深入...
在Java编程语言中,流(Stream)和文件操作是核心概念,它们对于处理输入和输出数据至关重要。在本文中,我们将深入探讨Java流和文件处理的一些关键知识点。 首先,流是Java中的一个抽象概念,它代表了数据的有序...
OpenHFT是一个专注于高性能Java框架的开源项目,提供了一系列工具和技术,以支持低延迟和高吞吐量的应用场景,尤其适用于金融领域的高频交易。 - **HugeCollections**:该项目提供了一组利用非堆内存实现的集合类,...
当处理内存限制或性能敏感的应用时,还可以利用NIO(New I/O)的特性,如`FileChannel`和`MappedByteBuffer`进行内存映射文件操作,这允许直接在磁盘和内存之间传输数据,而无需经过CPU。 总的来说,Java提供了多种...
- 节点流(Node Stream):直接与特定的数据源或目的地关联,如FileInputStream与文件关联。 - 处理流(Filter Stream):不直接与数据源或目的地关联,而是包裹在节点流之上,提供额外的功能,如...
- Java的 `MappedByteBuffer` 允许将文件直接映射到内存,提高读写性能,适用于大数据处理。 9. **流的关闭**: - 为了防止资源泄漏,使用完流之后必须关闭。Java 7引入了 try-with-resources 语句,可以自动关闭...
5. 缓冲区:BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter提供了缓冲功能,减少与底层资源的交互次数,提高性能。 6. 转换流:InputStreamReader和OutputStreamWriter作为字节流与...
"Farm: 文件分析与研究模块" 是一个专为处理和分析文件数据而设计的Java项目。这个模块可能包含了用于读取、解析、处理和展示文件信息的各种工具和类库,适用于大数据分析、日志处理、内容挖掘等多种场景。在Java...