直接I/O写入与自定义缓存区I/O读写性能之间的区别

来源:互联网 发布:进口商品条码查询软件 编辑:程序博客网 时间:2024/04/28 22:43
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class ReadWriteWithArray {public static void main(String [] args){try {// 直接读取写入数据long startTime = System.currentTimeMillis();ReadWriteWithArray.readWrite("a.txt", "b.txt");long endTime = System.currentTimeMillis();System.out.println("直接读取写入耗时:"+(endTime - startTime)+"ms");// 系统自定义缓存区读取写入数据startTime = System.currentTimeMillis();ReadWriteWithArray.readWriteBuffer("a.txt", "b.txt");endTime = System.currentTimeMillis();System.out.println("系统自定义缓存区读取写入耗时:"+(endTime - startTime)+"ms");// 自定义缓存区读取写入数据startTime = System.currentTimeMillis();ReadWriteWithArray.readWriteArray("a.txt", "b.txt");endTime = System.currentTimeMillis();System.out.println("通过自定义缓存区读取写入耗时:"+(endTime - startTime)+"ms");} catch (Exception e) {}}/** * 直接通过文件输入输出流读取与写入文件 *  * @param fileFrom 写入路径 *  * @param fileTo 写出路径 *  * @exception IOException I/O异常 *  * */public static void readWrite(String fileFrom, String fileTo) throws IOException{// 定义写入流InputStream is = null;// 定义输出流OutputStream os = null;try {is = new FileInputStream(fileFrom);os = new FileOutputStream(fileTo);while(true){// 数据读取int byteData = is.read();if(byteData == -1){// 读取完成break;}// 数据写出os.write(byteData);}} finally{// 关闭写入流if(is != null){is.close();}// 关闭输出流if(os != null){os.close();}}}/** * 通过系统缓存区类读取与写入文件 *  * @param fileFrom 写入路径 *  * @param fileTo 写出路径 *  * @exception IOException I/O异常 *  * */public static void readWriteBuffer(String fileFrom, String fileTo) throws IOException{// 定义写入流InputStream is = null;// 定义输出流OutputStream os = null;try {is = new BufferedInputStream(new FileInputStream(fileFrom));os = new BufferedOutputStream(new FileOutputStream(fileTo));while(true){// 数据读取int byteData = is.read();if(byteData == -1){// 读取完成break;}// 数据写出os.write(byteData);}} finally{// 关闭写入流if(is != null){is.close();}// 关闭输出流if(os != null){os.close();}}}/** * 通过自定义缓存区类读取与写入文件 *  * @param fileFrom 写入路径 *  * @param fileTo 写出路径 *  * @exception IOException I/O异常 *  * */public static void readWriteArray(String fileFrom, String fileTo) throws IOException{// 定义写入流InputStream is = null;// 定义输出流OutputStream os = null;try{is = new FileInputStream(fileFrom);os = new FileOutputStream(fileTo);// 拿取实际可读取字节数int availableLength = is.available();// 定义存放读取数据的数组byte[] totalBytes = new byte[availableLength];int byteData = is.read(totalBytes);// 数据写出os.write(byteData);}finally{// 关闭写入流if(is != null){is.close();}// 关闭输出流if(os != null){os.close();}}}}


结论,在文件没有超过1兆的情况下使用自定义缓存区读取写入性能比系统自带缓存区以及直接写入性能要高出很多,但是超过1兆的时候  就需要限制自定义读取数据的大小。

0 0