几种读取文件方式的性能测试

简介: 几种读取文件方式的性能测试

这些天一直在对文件进行读写操作,为了性能,换了好几种方式,我下面贴出来:

/**
* 随机读取文件内容
* 
* @param fileName
*/
public static String readFileByRandomAccess(String path) {
  StringBuffer sb = new StringBuffer();
  RandomAccessFile randomFile = null;
  try {
    // 打开一个随机访问文件流,按只读方式
    randomFile = new RandomAccessFile(path, "rw");
    byte[] bytes = new byte[1024];
    int byteread = 0;
    while ((byteread = randomFile.read(bytes)) != -1) {
      // System.out.write(bytes, 0, byteread);
      sb.append(new String(bytes, 0, byteread));
    }
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    if (randomFile != null) {
      try {
        randomFile.close();
      } catch (IOException e1) {
      }
    }
  }
  return sb.toString();
}


/**
* 以行为单位读取文件,常用于读面向行的格式化文件
* 
* @param fileName
*/
public static String readFileByLines(String path) {
  StringBuffer sb = new StringBuffer();
  BufferedReader reader = null;
  try {
    reader = new BufferedReader(new FileReader(path));
    String tempString = null;
    while ((tempString = reader.readLine()) != null) {
    sb.append(tempString).append(System.getProperty("line.separator"));// 显示行号
    }
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    try {
      if (reader != null) {
        reader.close();
      }
    } catch (IOException e) {
      System.err.println("流关闭失败");
    }
  }
  return sb.toString();
}


/**
* 使用Java.nio ByteBuffer字节将一个文件输出
* 
* @param filePath
*/
public static String readFileByBybeBuffer(String path) {
  StringBuffer sb = new StringBuffer();
  FileInputStream in = null;
  FileOutputStream out = null;
  try {
    // 获取源文件和目标文件的输入输出流
    in = new FileInputStream(path);
    // 获取输入输出通道
    FileChannel fcIn = in.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    CharBuffer charBuffer = null;
    Charset charset = Charset.forName("UTF-8");
    CharsetDecoder decoder = charset.newDecoder();
    while (true) {
      // clear方法重设缓冲区,使它可以接受读入的数据
      buffer.clear();
      // 从输入通道中将数据读到缓冲区
      int r = fcIn.read(buffer);
      if (r == -1) {
        break;
      }
      charBuffer = decoder.decode(buffer);
      // flip方法让缓冲区可以将新读入的数据写入另一个通道
      buffer.flip();
      sb.append(charBuffer.toString());
    }
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    try {
      if (in != null && out != null) {
        in.close();
        out.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  //System.out.println(sb.toString());
  return sb.toString();
}


/**
* 通过scanner的方式读取文件
* 
* @param fileName
* @return
*/
public static String readByScanner(String path) {
  StringBuffer sb = new StringBuffer();
  Scanner s = null;
  try {
    File f = new File(path);
      s = new Scanner(f);
      while (s.hasNext()) {
      sb.append(s.next());
    }
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } finally {
    if(s!=null)s.close();
  }
  return sb.toString();
}


我们来测试下:

String fileName="Z:\\flume\\flume\\conf\\ErrLog";
long t1=OperateUtil.getTime();
OperateUtil.readByScanner(fileName);
long t2=OperateUtil.getTime();
OperateUtil.readFileByBybeBuffer(fileName);
long t3=OperateUtil.getTime();
OperateUtil.readFileByLines(fileName);
long t4=OperateUtil.getTime();
OperateUtil.readFileByRandomAccess(fileName);
long t5=OperateUtil.getTime();
    
System.out.println("readByScanner:"+(t2-t1));
System.out.println("readFileByBybeBuffer:"+(t3-t2));
System.out.println("readFileByLines:"+(t4-t3));
System.out.println("readFileByRandomAccess:"+(t5-t4));
ErrLog的文件大小是65M。


下面看下测试结果:

readByScanner:6180
readFileByBybeBuffer:171
readFileByLines:468
readFileByRandomAccess:531


经过多次测试,依旧发现readFileByBybeBuffer这个方式的效率更好,使用的是NIO

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
打赏
0
0
0
0
108
分享
相关文章
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
61 0
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
191 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
FunASR英文离线文件转写软件包问题之性能测试详细结果查看如何解决
FunASR英文离线文件转写软件包问题之性能测试详细结果查看如何解决
226 0
|
9月前
|
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
503 56
Kali渗透测试:自动播放文件攻击
Kali渗透测试:自动播放文件攻击
132 0
Kali 渗透测试:利用HTA文件进行渗透攻击
Kali 渗透测试:利用HTA文件进行渗透攻击
113 1
|
10月前
|
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
129 1
单元测试问题之使用JSON文件作为参数化测试的输入源如何解决
单元测试问题之使用JSON文件作为参数化测试的输入源如何解决
207 0
|
11月前
|
FunASR离线文件转写软件包3.0问题之推理效率测试的配置如何解决
FunASR离线文件转写软件包3.0问题之推理效率测试的配置如何解决
88 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等