java中常见IO的读写效率对比


摘自:http://blog.csdn.net/sun7545526/article/details/7413347

java中的IO的类库非常的庞大,选择性非常的多,当面临一个问题时,往往不知道如何下手!

更具我现在的理解,在效率不是非常重要的情况下,一般情况下可能只需要考虑两种情况,即想按照字节去读取,还是想按照行去读取,而一般情况无论采取什么方式去读取,最佳的方式都莫过于用Buffered...去包装要是用的类,而如果效率要求比较高则可以考虑是用FileChannel 或者是 file map,其中file Map是读写效率最高的一种方式,如果读取的文件非常的大这种方式是首选,下面的例子是对常见几种读文件方式的效率比较,通过一个动态代理的模式来统计每个方法的执行时间,测试文件是100多兆的数据文件

package com.eric.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;

import com.eric.reflect.ExecuteTimerHandler;

public class ReadFileTools implements IReadFileTools {
    
    /**
     * 
     * execute readByBufferReader spend 444 million sencond!
        execute readByBufferedInputStreamNoArray spend 27903 million sencond!
        execute readByBufferedInputStream spend 192 million sencond!
        execute readByChannel spend 484 million sencond!
        execute readByChannelMap spend 42 million sencond!
        execute readByDataInputStream spend 440 million sencond!
     * 
     * @param args
     * @throws Exception
     */
    public static final int        BUFFSIZE     = 180;
    public static final String    root         = "E:\\sourcecode\\corejava\\src\\com\\eric\\io\\";
    public static final boolean    printContext    = false;
    
    public static void main(String[] args) throws Exception {
        String file = root + "VISA_INPUT_FULL";
        IReadFileTools bi = (IReadFileTools) ExecuteTimerHandler.newInstance(new ReadFileTools());
        bi.readByBufferReader(file);
        bi.readByBufferedInputStreamNoArray(file);
        bi.readByBufferedInputStream(file);
        bi.readByChannel(file);
        bi.readByChannelMap(file);
        bi.readByDataInputStream(file);
    }
    
    /*
     * execute readBuffer spend 421 million sencond! execute readByte spend
     * 36172 million sencond!
     */
    public String readByBufferReader(String file) {
        StringBuilder sb = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File(file)));
            String line;
            long count = 0;
            while ((line = br.readLine()) != null) {
                if (printContext) {
                    System.out.println(line);
                }
                
                sb.append(line);
                count += line.length();
            }
            br.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return sb.toString();
    }
    
    public void readByDataInputStream(String file) throws Exception {
        
        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(new ReadFileTools().readByBufferReader(file).getBytes()));
        while (dis.available() > 0) {
            char c = (char) dis.read();
            if (printContext) {
                System.out.println(c);
            }
        }
    }
    //this method not use byte array to get byte
    public String readByBufferedInputStreamNoArray(String file) {
        try {
            InputStream is = new BufferedInputStream(new FileInputStream(new File(file)));
            while (is.available() > 0) {
                char c = (char) is.read();
                if (printContext) {
                    System.out.println(c);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
    //use byte array to get bytes from file
    public void readByBufferedInputStream(String file) throws Exception {
        BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
        byte[] bytes = new byte [BUFFSIZE];
        while (input.available() > 0) {
            input.read(bytes);
        }
    }
    //use file channel to get byte from file
    public void readByChannel(String file) throws Exception {
        
        FileChannel in = new FileInputStream(file).getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(BUFFSIZE);
        while (in.read(buffer) != -1) {
            buffer.flip(); // Prepare for writing
            if (printContext) {
                System.out.println(buffer.getChar());
            }
            buffer.clear(); // Prepare for reading
        }
        in.close();
    }
    //use MappedByteBuffer to read byte from file
    public void readByChannelMap(String file) throws Exception {
        FileChannel fc = new FileInputStream(new File(file)).getChannel();
        CharBuffer cb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()).asCharBuffer();
        char c;
        while (cb.hasRemaining())
            c = cb.get();
        if (printContext) {
            System.out.println(c);
        }
        fc.close();
    }
    
    public void copyFileByChannel(String file, String file2) throws Exception {
        
        FileChannel in = new FileInputStream(file).getChannel();
        FileChannel out = new FileOutputStream(file2).getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(BUFFSIZE);
        while (in.read(buffer) != -1) {
            buffer.flip(); // Prepare for writing
            out.write(buffer);
            buffer.clear(); // Prepare for reading
        }
    }
    
    public void test() {
        System.out.println("test");
    }
    
    public void copyFile(String source, String dest) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader(new File(source)));
        BufferedWriter bw = new BufferedWriter(new FileWriter(new File(dest)));
        String temp;
        while ((temp = br.readLine()) != null) {
            bw.write(temp + "\n");
        }
    }
    
    public void storingAndRecoveringData(String file) throws Exception {
        DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
        DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
        dos.writeBoolean(false);
        dos.writeByte(10);
        dos.writeDouble(1213654);
        dos.writeUTF("aihua");
        dos.close();
        System.out.println(dis.readBoolean());
        System.out.println(dis.readByte());
        System.out.println(dis.readDouble());
        System.out.println(dis.readUTF());
        dis.close();
        
    }
    
    public void doCopyFile(String src, String dest) throws IOException {
        File srcFile = new File(src);
        File destFile = new File(dest);
        if (destFile.exists()) {
            boolean d = destFile.delete();
            
            if (d) {
                System.out.print("删除成功!");
            } else {
                System.out.print("删除失败!");
            }
        }
        BufferedInputStream input = new BufferedInputStream(new FileInputStream(srcFile));
        try {
            BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(destFile));
            try {
                byte[] buffer = new byte [4096];
                int n = 0;
                while (-1 != (n = input.read(buffer))) {
                    output.write(buffer, 0, n);
                }
                System.out.println("Copy Successful::" + dest);
            } finally {
                try {
                    if (output != null) {
                        output.close();
                    }
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        } finally {
            try {
                if (input != null) {
                    input.close();
                }
            } catch (IOException ioe) {
                System.out.println("failed src file:" + src + " reason:" + ioe.getMessage());
            }
        }
    }
    
}

/*
 * 
 * History:
 * 
 * 
 * 
 * $Log: $
 */

 

posted on 2013-01-27 20:50  青春丶冭柔情  阅读(461)  评论(0编辑  收藏  举报

导航