`

Java IO读写大文件的几种方式及测试

    博客分类:
  • java
 
阅读更多
Java IO读写大文件的几种方式及测试

读取文件大小:1.45G
第一种,OldIO:
public static void oldIOReadFile() throws IOException{   
    BufferedReader br = new BufferedReader(new FileReader("G://lily_947.txt"));   
    PrintWriter pw = new PrintWriter("G://oldIO.tmp");   
    char[] c = new char[100*1024*1024];   
    for(;;){   
        if(br.read(c)!=-1){   
            pw.print(c);   
        }else{   
            break;   
        }   
    }   
    pw.close();   
    br.close();   
}  

耗时70.79s
第二种,newIO:
public static void newIOReadFile() throws IOException{   
        FileChannel read = new RandomAccessFile("G://lily_947.txt","r").getChannel();   
        FileChannel writer = new RandomAccessFile("G://newIO.tmp","rw").getChannel();   
        ByteBuffer bb = ByteBuffer.allocate(200*1024*1024);   
        while(read.read(bb)!=-1){   
            bb.flip();   
            writer.write(bb);   
            bb.clear();   
        }   
        read.close();   
        writer.close();   
           
    }  

耗时47.24s

第三种,RandomAccessFile:
public static void randomReadFile() throws IOException{   
        RandomAccessFile read = new RandomAccessFile("G://lily_947.txt","r");   
        RandomAccessFile writer = new RandomAccessFile("G://random.tmp","rw");   
        byte[] b = new byte[200*1024*1024];   
        while(read.read(b)!=-1){   
            writer.write(b);   
        }   
        writer.close();   
        read.close();   
    }  

耗时46.65

第四种,MappedByteBuffer:
public static void mappedBuffer() throws IOException{   
        FileChannel read = new FileInputStream("G://lily_947.txt").getChannel();   
        FileChannel writer = new RandomAccessFile("G://buffer.tmp","rw").getChannel();   
        long i = 0;   
        long size = read.size()/30;   
        ByteBuffer bb,cc = null;   
        while(i<read.size()&&(read.size()-i)>size){   
            bb = read.map(FileChannel.MapMode.READ_ONLY, i, size);   
            cc = writer.map(FileChannel.MapMode.READ_WRITE, i, size);   
            cc.put(bb);   
            i+=size;   
            bb.clear();   
            cc.clear();   
        }   
        bb = read.map(FileChannel.MapMode.READ_ONLY, i, read.size()-i);   
        cc.put(bb);   
        bb.clear();   
        cc.clear();   
        read.close();   
        writer.close();   
           
    }  

耗时:36

前三种读法对应的资源占用图如下:
相对于最后一种内存直接映射方式前面的测试其实无意义,基本秒杀。。。。。
对于很大的文件直接分块映射时内存会不够,这是因为MappedByteBuffer未被释放造成的,sun未提供直接回收MappedByteBuffer区域的方法,这个时候有两种方法解决,第一种比较愚笨的:
 System.gc();    
         System.runFinalization();    
         try {   
    Thread.sleep(3000);   
} catch (InterruptedException e) {   
       
    e.printStackTrace();   
}  

第二种网上找来的,利用反射调用clean方法:
public static void unmap(final MappedByteBuffer buffer) {   
        if (buffer == null) {   
            return;   
        }   
        AccessController.doPrivileged(new PrivilegedAction<Object>() {   
            public Object run() {   
                try {   
                    Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);   
                    if (getCleanerMethod != null) {   
                        getCleanerMethod.setAccessible(true);   
                        Object cleaner = getCleanerMethod.invoke(buffer, new Object[0]);   
                        Method cleanMethod = cleaner.getClass().getMethod("clean", new Class[0]);   
                        if (cleanMethod != null) {   
                            cleanMethod.invoke(cleaner, new Object[0]);   
                        }   
                    }   
                } catch (Exception e) {   
                    e.printStackTrace();   
                }   
                return null;   
            }   
    
        });   
    }  

转载自http://blog.sina.com.cn/s/blog_6699fade01012bvo.html
分享到:
评论

相关推荐

    Java IO流几种经典使用方式

    ### Java IO流几种经典使用方式 #### 一、输入输出流(Input/Output Stream) 在Java中,`java.io`包提供了处理输入/输出操作的基本类,主要包括`InputStream`和`OutputStream`。 ##### 1. 字节流(Byte Stream) **...

    使用Java实现对dbf文件的简单读写

    使用 Java 实现对 dbf 文件的简单读写需要使用以下几个类: 1. DBFWriter:用于 dbf 文件的写操作,提供了写入 dbf 文件的方法。 2. JDBField:用于表示 dbf 文件中的字段信息,包括字段名、字段类型、字段长度等。...

    java io 与java nio区别

    - **Java IO**:采用流(Stream)的方式进行数据读写,数据以字节流或字符流的形式进行传输。 - **Java NIO**:采用缓冲区(Buffer)的方式进行数据读写。所有的数据都会先加载到缓冲区中,再通过通道(Channel)进行读写...

    java io.pdf

    7. **NIO(New IO)**:从Java 1.4开始引入,NIO提供了一种非阻塞的I/O模型,适合高并发和大容量数据传输场景。关键组件包括选择器(Selector)、通道(Channel)和缓冲区(Buffer)。 8. **文件系统操作**:Java还提供了...

    java-IO操作-(读写、追加、删除、移动、复制、修改).doc

    文件读取操作是 java IO 操作的基础,主要有以下几种方式: 1. 按字节读取文件内容:以字节为单位读取文件内容,常用于读取二进制文件。 2. 按字符读取文件内容:以字符为单位读取文件内容,常用于读取文本、数字等...

    Java,彻底明白Java语言中的IO系统

    Java IO系统提供了以下几种转换流: - `InputStreamReader`:将字节流转换为字符流。 - `OutputStreamWriter`:将字符流转换为字节流。 #### 6. 过滤器流 过滤器流是在原有流的基础上添加额外功能的流,它可以对...

    javaIO详细讲解+详细案例

    ### Java IO 流详解 #### 一、Java IO 流概念及作用 Java IO(Input/Output)流是Java编程语言中的一个重要组成部分,主要用于...无论是简单的文件读写还是复杂的网络通信,Java IO流都能提供灵活且高效的解决方案。

    java全栈工程师-java io

    ### 常见几种IO操作 #### 1. 文件IO - **FileInputStream/FileOutputStream**:用于处理文件的字节流读写。 - **FileReader/FileWriter**:用于处理文件的字符流读写。 - **BufferedReader/BufferedWriter**:提供...

    Java IO

    Java IO的基本概念之一是流,它是一种数据传输的方式。Java中的流被抽象成一系列连续的数据元素,这些数据元素可以是字节或字符。流分为两种基本类型:输入流和输出流。输入流是从外部源读取数据到程序,而输出流则...

    java_IO操作_(读写、追加、删除、移动、复制、修改)

    Java提供了多种方式来读取文件内容,主要分为以下几种: - **按字节读取**:适用于读取二进制文件,如图片、音频或视频文件。使用`FileInputStream`类,通过`read()`方法一次读取一个字节,或一次读取多个字节到...

    Java基础篇:IO流.pdf

    Java中的IO流主要分为输入流和输出流两大类,每类又可以根据数据处理方式的不同细分为多种具体实现。本知识点将深入探讨Java IO流的相关细节,包括节点流与处理流的概念,以及文件流、标准输入输出流、缓冲流、转换...

    JAVA读写文件小实例

    首先,我们需要理解Java中的几个关键类,如`java.io.File`、`java.io.FileReader`、`java.io.FileWriter`、`java.io.BufferedReader`和`java.io.BufferedWriter`,它们在文件操作中起着核心作用。 `File`类是Java中...

    java读写文件的集中方式

    本文将详细介绍几种常见的Java文件读写方式,包括按行读取和写入、随机读取以及按字节读取。 1. **按行读取和写入** 在Java中,我们可以使用`BufferedReader`和`PrintWriter`类来实现按行读取和写入文件。`...

    Java流(文件读写操作)

    ### Java流(文件读写操作) #### 一、流的分类 Java中处理文件和数据时,使用流的概念来进行操作。根据不同的标准,流可以分为几种类型。 ##### 1. 按数据流动方向 - **输入流**:主要用于从数据源读取数据。输入...

    Java IO, NIO and NIO.2

    Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...

    java io案例

    Java IO(输入/输出)是Java编程语言中的一个重要部分,用于处理各种数据流,包括从文件、网络、设备等读取数据以及向这些地方写入数据。本案例将深入探讨Java IO流的基本概念、主要类库及其在实际编程中的应用。 ...

    基于java的读写文本文件的示例代码.zip

    - **PrintWriter**:`java.io.PrintWriter`提供了一种方便的方式来写入文本,支持自动换行。 ```java File file = new File("path_to_output_file"); PrintWriter writer = new PrintWriter(file); writer....

    java基础 IO流

    java基础中的IO流是Java提供的一套用于文件读写操作的流式API,它包括字节流和字符流两种基本类型。字节流主要用在处理二进制数据,而字符流则是处理文本数据。 首先,文档中提到了`File`类,它是IO流操作中用于...

Global site tag (gtag.js) - Google Analytics