NIO这个东西想必大家都比较熟悉,今天我特意查了下NIO和IO的区别以及代码测试了下性能,NIO在速度上的确不占优势,以下:我是用BufferedReader 和FileWriter来进行数据的copy,利用行读取来做的,
public void largeFileIO(String inputFile, String outputFile,int count) {
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(inputFile)));
FileInputStream o = new FileInputStream(inputFile);
// GZIPInputStream gzipout = new GZIPInputStream(o);//压缩文件
BufferedReader in = new BufferedReader(new InputStreamReader(o, "utf-8"),1024*10);//10M缓存
FileWriter fw = new FileWriter(outputFile,true);
int c=0;
while (in.ready()) {
String line = in.readLine();
System.out.println(c);
c++;
fw.append(line + "\n");
if(c==count){
fw.flush();
c=0;
}
}
in.close();
fw.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
不到一分钟拷贝代码已经有400M,速度可见之快,我利用NIO的代码来读取数据进行拷贝传输
public void readFile(String saveFile,String anlysisFile){
int bufsize=1024*1024*10;
try {
/**
* 輸入輸出流
*/
File fin=new File(anlysisFile);
File fout=new File(saveFile);
/***
* 輸入輸出管道
*/
FileChannel fcin =new RandomAccessFile(fin, "r").getChannel();
ByteBuffer rbuf=ByteBuffer.allocateDirect(bufsize);
/**
* 输出管道
*/
FileChannel fcout=new RandomAccessFile(fout, "rws").getChannel();
ByteBuffer wbuf=ByteBuffer.allocateDirect(bufsize);
readFileByLine(bufsize,fcin,fcout,rbuf,wbuf);
System.out.println("OK");
} catch (IOException e) {
e.printStackTrace();
}
}
public void readFileByLine(int bufsize,FileChannel fcin,FileChannel fcout,ByteBuffer rbuf,ByteBuffer wbuf){
/***
* 以转行符分割 結尾
*/
String endterStr = "\n";
try {
byte[] bs=new byte[bufsize];
StringBuffer strbuf=new StringBuffer("");
/**
* 利用FileChannel读取buffer中的数据
*/
while(fcin.read(rbuf)!=-1){
/**
* 记录下一个读取的位置
*/
int rsize=rbuf.position();
rbuf.rewind();
rbuf.get(bs);
rbuf.clear();
String tempString=new String(bs,0,rsize);
System.out.println(tempString);
int fromIndex=0;
int endIndex=0;
while((endIndex=tempString.indexOf(endterStr,fromIndex))!=-1){
String line=tempString.substring(fromIndex,endIndex);
line=new String(strbuf.toString()+line);
writeFileByLine(fcout,wbuf,line);
strbuf.delete(0, strbuf.length());
fromIndex=endIndex+1;
}
if(rsize>tempString.length()){
strbuf.append(tempString.substring(fromIndex,tempString.length()));
}else{
strbuf.append(tempString.subSequence(fromIndex, rsize));
}
}
} catch (IOException e) {
e.printStackTrace();
}
};
public static void writeFileByLine(FileChannel fcout, ByteBuffer wBuffer, String line){
try {
fcout.write(wBuffer.wrap(line.getBytes()), fcout.size());
} catch (IOException e) {
e.printStackTrace();
}
}
以上代码借鉴http://www.blogjava.net/jjshcc/archive/2013/12/17/407694.html ,可能是按照字节码读取的吧,然后加了下别的处理,但是单独测试读取的速度也很慢,测试后结论,通过第一种方法来处理数据要比第二种方法处理数据,至少相差100多倍的效率!可能我知道的太少了吧,求大家喷喷我!让我长点知识!
相关推荐
Java IO(Input/Output)是Java编程语言中用于处理输入输出操作的基础框架,它提供了丰富的类库,使得程序能够与各种设备、文件、网络进行数据交互。然而,传统的IO模型在处理大量并发连接时表现出效率较低的问题,...
Java 中的 IO 和 NIO 是两个不同的输入/输出机制,它们之间有许多区别。下面我们将详细讲解 IO 和 NIO 的区别。 1. 数据处理方式 标准 IO 以流的方式处理数据,也就是说数据是以流的形式传输的,而 NIO 则以块的...
### Java IO 与 Java NIO 的区别 在深入探讨Java IO与Java NIO之间的区别之前,我们先简单回顾一下这两种I/O模型的基本概念。 #### 1. Java IO(Blocking IO) Java IO,也称为传统的阻塞式IO或同步阻塞式IO,是...
Java IO与NIO是Java平台中用于处理输入输出操作的核心技术。它们在处理数据传输、文件操作、网络通信等方面起着至关重要的作用。本篇将深入探讨这两个领域,旨在帮助开发者更好地理解和应用这些概念。 首先,Java ...
Java IO (Input/Output) 和 NIO (Non-blocking Input/Output) 是Java平台中用于处理输入和输出操作的重要部分。这两种技术在实现客户端与服务器之间的通信时起着至关重要的作用。下面将详细介绍Java IO和NIO的特点、...
### Java NIO 处理超大数据文件的知识点详解 ...综上所述,使用Java NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。
在"JavaIODemo"这个练习中,我们可能会看到以下内容: 1. 流的创建与使用:演示如何创建输入流和输出流对象,例如从文件读取数据并写入到另一个文件。 2. 缓冲技术:使用BufferedReader和BufferedWriter实现高效的...
在Java编程语言中,`IO`(Input/Output)和`NIO`(Non-blocking Input/Output)是处理数据输入和输出的关键技术。本压缩包包含`JAVA_IO/NIO(demo,压缩jar文件)`,意味着它提供了一些示例代码,用于演示如何使用这两...
Java的IO与NIO系统是Java平台中处理输入输出的核心技术。它们主要负责程序与外部世界的通信,包括读取文件、网络数据交换等。本文将深入探讨NIO(New Input/Output)与IO的区别,以及NIO中的关键概念——Channel、...
在Java NIO(New Input/Output)框架中,虽然提供了高效且灵活的I/O操作方式,但默认并不支持按行读取文件数据。正如描述中提到的,开发者通常需要自定义方法来实现这一功能。上述代码片段展示了如何使用NIO以行作为...
其中,NIO(New IO)是Java 1.4版本引入的一种新的IO处理方式,相较于传统的阻塞IO,NIO提供了更高的效率和灵活性。 #### 二、传统IO与NIO的区别 **1. 阻塞与非阻塞** - **传统IO**: 阻塞式操作,当进行读写操作...
在探讨Java.nio与Java.io之间的比较时,我们首先需要理解这两个包在Java编程语言中的核心作用和它们各自的优势。Java.io和Java.nio是Java中处理输入/输出操作的两个主要框架,它们各自拥有独特的特性和应用场景。 #...
Java中的IO与NIO是Java开发中至关重要的概念,它们主要负责数据的输入与输出操作。在面试中,了解和掌握这些知识点对于成为一名合格的Java开发者至关重要。 首先,Java的IO流体系是其核心特性之一。IO流可以分为四...
相比于传统的IO(Input/Output)模型,NIO引入了非阻塞I/O、字符转换、缓冲和通道等新特性,极大地提高了Java程序在处理I/O操作时的性能。 1. **Buffer**:在传统的IO操作中,数据通常直接在流之间传输,这可能导致...
在Java编程语言中,`IO`(Input/Output)是处理数据输入和输出的核心部分,尤其是在处理大数据量文件时显得尤为重要。Java IO API提供了一系列类和接口,使得开发者能够高效地读取、写入和操作文件。下面我们将深入...
为了高效地处理这类问题,我们可以利用Java的`java.nio`包中的BufferedReader和FileChannel等类,实现按行读取大文件,并将其内容解析后存储到数据库中。本文将详细讲解这一过程。 首先,我们需要了解`java.nio`包...
### Java NIO与IO的区别和比较 #### 引言 随着网络技术的飞速发展,企业和个人对网络应用程序的性能要求日益提高。特别是在高并发环境下,服务器需要处理来自数百乃至数千个客户端的同时连接请求,这使得传统的...
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Non-blocking IO(非阻塞IO) Java NIO...