IO---Java 不同读写方式的IO性能

利用不同的读写方式实现复制时,不同的方法对大文件有较大的影响。

下面就三种方式测试一下。

Ps:System.currentMillis();用于记录那一刻的时间。

1.利用单字节的方式直接复制(速度慢)

实现方法如下

public static void dzj(File infile,File outfile) throws IOException{
    FileInputStream in =new FileInputStream(infile);
    FileOutputStream out=new FileOutputStream(outfile);
    if(!infile.exists())
        throw new IllegalArgumentException("此文件不存在");
    if(!infile.isFile())
        throw new IllegalArgumentException("此文件不是目录");
    long a=System.currentTimeMillis();
    int i;
    while((i=in.read())!=-1){
        out.write(i);
        out.flush();
    }
    long b=System.currentTimeMillis();
    System.out.println("单字节直接复制用时"+(b-a));
    in.close();
    out.close();
}

2.利用缓冲区Bufferef提高性能(速度有较为明显的提高)

public static void hc(File infile,File outfile)throws IOException{
    BufferedInputStream in=new BufferedInputStream(new FileInputStream(infile));
    BufferedOutputStream  out=new BufferedOutputStream(new FileOutputStream(outfile));

    if(!infile.isFile())
        throw new IllegalArgumentException("这不是文件");
    if(!infile.exists())
        throw new IllegalArgumentException("文件不存在");
    long a=System.currentTimeMillis();
    int i;
    while((i=in.read())!=-1){
        out.write(i);
        out.flush();
    }
    long b=System.currentTimeMillis();
    System.out.println("读写用缓冲区的用时为:"+(b-a));
    in.close();
    out.close();
}

3.利用字节数组批量读写字节(速度提升非常明显,开辟了内存)

public static void bytes(File infile,File outfile)throws IOException{
    FileInputStream in =new FileInputStream(infile);
    FileOutputStream out =new FileOutputStream(outfile);
    if(!infile.exists())
        throw new IllegalArgumentException("文件不存在");
    if(!infile.isFile())
        throw new IllegalArgumentException("不是文件");
    long a=System.currentTimeMillis();
    int bytes;
    byte []buf=new byte[20*1024];
    while((bytes=in.read(buf,0,buf.length))!=-1){
        out.write(buf, 0, bytes);
        out.flush();
    }
    long b=System.currentTimeMillis();
    System.out.println("字节数组方法用时为:"+(b-a));
    in.close();
    out.close();
}

以上代码运行结果如下:

测试文件为  10.1 MB (10,616,738 字节)

时间: 2024-10-20 03:10:37

IO---Java 不同读写方式的IO性能的相关文章

(IO流)java中多种方式读文件,追加文件内容,对文件的各种操作

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.io.R

java四种文件读写方式及性能比较

测试代码 package com.boot.demo.test.io; import java.io.*; import java.lang.reflect.Method; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOp

JAVA进行基础的文件IO读写

1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 public class TestIO { 8 9 public void testRead(String path){ 10 FileInputStream is =

java解析xml文件四种方式介绍、性能比较和基本使用方法

一.介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不

Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 SocketChannel 的关系 事件监听类型 字节缓冲 ByteBuffer 数据结构 场景 接着上一篇中的站点访问问题,如果我们需要并发访问10个不同的网站,我们该如何处理? 在上一篇中,我们使用了java.net.socket类来实现了这样的需求,以一线程处理一连接的方式,并配以线程池的控制

Java中的NIO和IO的对比分析

总的来说,java中的IO和NIO主要有三点区别: IO                  NIO 面向流     面向缓冲 阻塞IO  非阻塞IO  无   选择器(Selectors) 1.面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方.此外,它不能前后移动流中的数据.如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区. Java

Java输入、输入、IO流 类层次关系梳理

Java输入.输入.IO流 类层次关系梳理 本文主要关注在Java编程中涉及到的IO相关的类库.方法.以及对各个层次(抽线.接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/1007958.htm?noadapt=1 http://blog.csdn.net/hguisu/article/details/7418161 https://www.ibm.com/developerworks/cn/java/j-lo-javaio/ http:/

Java复习第四天---IO流

File类测试 //根据指定的文件名和路径创建File对象 File file = new File("myFile.txt"); //file.exists();检测文件是否存在 boolean exists = file.exists(); System.out.println(exists); //按照file对象指定的路径和文件名创建一个新的文件 file.createNewFile(); exists = file.exists(); System.out.println(e

Java入门——(7)IO(输入与输出)

IO流位于java.io包中,根据操作数据不同,分为字节流和字符流:根据数据输入方面的不同又可分为输入流和输出流,无论是何种流,最终都依赖于操作系统. 一.字节流: 1.字节流,主要用于图片.音频.视频的传输,以二进制的形式进行,分为字节输入流和字节输出流:字节流操作的是字节数组:字符流操作的是字符数组. 2.字节输入与字节输出流的继承体系图 3.InputStream 与OutputStream常用方法 InputStream 常用方法 方法声明 功能描述 int read() 从输入流读取一