`
guoyangjie
  • 浏览: 14799 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中io和nio中的行读取速度之我见

    博客分类:
  • java
阅读更多

             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_NIO

    Java IO(Input/Output)是Java编程语言中用于处理输入输出操作的基础框架,它提供了丰富的类库,使得程序能够与各种设备、文件、网络进行数据交互。然而,传统的IO模型在处理大量并发连接时表现出效率较低的问题,...

    IO和NIO区别

    Java 中的 IO 和 NIO 是两个不同的输入/输出机制,它们之间有许多区别。下面我们将详细讲解 IO 和 NIO 的区别。 1. 数据处理方式 标准 IO 以流的方式处理数据,也就是说数据是以流的形式传输的,而 NIO 则以块的...

    java io 与java nio区别

    ### Java IO 与 Java NIO 的区别 在深入探讨Java IO与Java NIO之间的区别之前,我们先简单回顾一下这两种I/O模型的基本概念。 #### 1. Java IO(Blocking IO) Java IO,也称为传统的阻塞式IO或同步阻塞式IO,是...

    Java IO与NIO文档

    Java IO与NIO是Java平台中用于处理输入输出操作的核心技术。它们在处理数据传输、文件操作、网络通信等方面起着至关重要的作用。本篇将深入探讨这两个领域,旨在帮助开发者更好地理解和应用这些概念。 首先,Java ...

    JAVA IO and NIO

    Java IO (Input/Output) 和 NIO (Non-blocking Input/Output) 是Java平台中用于处理输入和输出操作的重要部分。这两种技术在实现客户端与服务器之间的通信时起着至关重要的作用。下面将详细介绍Java IO和NIO的特点、...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 ...综上所述,使用Java NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。

    JavaIO和NIO练习

    在"JavaIODemo"这个练习中,我们可能会看到以下内容: 1. 流的创建与使用:演示如何创建输入流和输出流对象,例如从文件读取数据并写入到另一个文件。 2. 缓冲技术:使用BufferedReader和BufferedWriter实现高效的...

    JAVA_IO/NIO(demo,压缩jar文件)

    在Java编程语言中,`IO`(Input/Output)和`NIO`(Non-blocking Input/Output)是处理数据输入和输出的关键技术。本压缩包包含`JAVA_IO/NIO(demo,压缩jar文件)`,意味着它提供了一些示例代码,用于演示如何使用这两...

    JAVA的IO与NIO

    Java的IO与NIO系统是Java平台中处理输入输出的核心技术。它们主要负责程序与外部世界的通信,包括读取文件、网络数据交换等。本文将深入探讨NIO(New Input/Output)与IO的区别,以及NIO中的关键概念——Channel、...

    NIO按行读取数据

    在Java NIO(New Input/Output)框架中,虽然提供了高效且灵活的I/O操作方式,但默认并不支持按行读取文件数据。正如描述中提到的,开发者通常需要自定义方法来实现这一功能。上述代码片段展示了如何使用NIO以行作为...

    JAVA IO-NIO 详解

    其中,NIO(New IO)是Java 1.4版本引入的一种新的IO处理方式,相较于传统的阻塞IO,NIO提供了更高的效率和灵活性。 #### 二、传统IO与NIO的区别 **1. 阻塞与非阻塞** - **传统IO**: 阻塞式操作,当进行读写操作...

    Java.nio 与Java.io比较

    在探讨Java.nio与Java.io之间的比较时,我们首先需要理解这两个包在Java编程语言中的核心作用和它们各自的优势。Java.io和Java.nio是Java中处理输入/输出操作的两个主要框架,它们各自拥有独特的特性和应用场景。 #...

    Java中的IO与NIO-jiava求职面试-15题,答案

    Java中的IO与NIO是Java开发中至关重要的概念,它们主要负责数据的输入与输出操作。在面试中,了解和掌握这些知识点对于成为一名合格的Java开发者至关重要。 首先,Java的IO流体系是其核心特性之一。IO流可以分为四...

    Java_NIO与IO的区别和比较.doc

    相比于传统的IO(Input/Output)模型,NIO引入了非阻塞I/O、字符转换、缓冲和通道等新特性,极大地提高了Java程序在处理I/O操作时的性能。 1. **Buffer**:在传统的IO操作中,数据通常直接在流之间传输,这可能导致...

    java io读取文件

    在Java编程语言中,`IO`(Input/Output)是处理数据输入和输出的核心部分,尤其是在处理大数据量文件时显得尤为重要。Java IO API提供了一系列类和接口,使得开发者能够高效地读取、写入和操作文件。下面我们将深入...

    java按行读取大文件并解析入库

    为了高效地处理这类问题,我们可以利用Java的`java.nio`包中的BufferedReader和FileChannel等类,实现按行读取大文件,并将其内容解析后存储到数据库中。本文将详细讲解这一过程。 首先,我们需要了解`java.nio`包...

    Java NIO与IO的区别和比较.pdf

    ### Java NIO与IO的区别和比较 #### 引言 随着网络技术的飞速发展,企业和个人对网络应用程序的性能要求日益提高。特别是在高并发环境下,服务器需要处理来自数百乃至数千个客户端的同时连接请求,这使得传统的...

    java NIO 视频教程

    标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Non-blocking IO(非阻塞IO) Java NIO...

Global site tag (gtag.js) - Google Analytics